src/node/mac48-address.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 04 Jul 2009 08:15:48 +0200
changeset 4654 2eaebe77d66b
parent 4424 af26433b13bc
permissions -rw-r--r--
Added tag ns-3.5 for changeset c975274c9707
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1181
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     2
/*
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     3
 * Copyright (c) 2007 INRIA
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     4
 *
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     7
 * published by the Free Software Foundation;
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     8
 *
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    12
 * GNU General Public License for more details.
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    13
 *
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    14
 * You should have received a copy of the GNU General Public License
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    15
 * along with this program; if not, write to the Free Software
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    17
 *
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
762d1616e16a add license headers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1179
diff changeset
    19
 */
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    20
#include "mac48-address.h"
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "address.h"
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "ns3/assert.h"
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    23
#include <iomanip>
1170
39ca41540e00 fix optimized build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1167
diff changeset
    24
#include <iostream>
3365
6409d2460601 bug 245: build failure with gcc 4.3.x
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2954
diff changeset
    25
#include <string.h>
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
namespace ns3 {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
2582
3e28107b870f rename old VALUE leftovers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2422
diff changeset
    29
ATTRIBUTE_HELPER_CPP (Mac48Address);
2422
6cbcb8fe4551 macro-ify
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2411
diff changeset
    30
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
#define ASCII_a (0x41)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
#define ASCII_z (0x5a)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
#define ASCII_A (0x61)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
#define ASCII_Z (0x7a)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
#define ASCII_COLON (0x3a)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
#define ASCII_ZERO (0x30)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
static char
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
AsciiToLowCase (char c)
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    40
{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
  if (c >= ASCII_a && c <= ASCII_z) {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
    return c;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
  } else if (c >= ASCII_A && c <= ASCII_Z) {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
    return c + (ASCII_a - ASCII_A);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
  } else {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
    return c;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
  }
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
}
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    51
Mac48Address::Mac48Address ()
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
  memset (m_address, 0, 6);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
}
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    55
Mac48Address::Mac48Address (const char *str)
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
  int i = 0;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  while (*str != 0 && i < 6) 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
    {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
      uint8_t byte = 0;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
      while (*str != ASCII_COLON && *str != 0) 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
	{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
	  byte <<= 4;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
	  char low = AsciiToLowCase (*str);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
	  if (low >= ASCII_a) 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
	    {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
	      byte |= low - ASCII_a + 10;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
	    } 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
	  else 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
	    {
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
	      byte |= low - ASCII_ZERO;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
	    }
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
	  str++;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
	}
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
      m_address[i] = byte;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
      i++;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
      if (*str == 0) 
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
	{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
	  break;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
	}
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
      str++;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
    }
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
  NS_ASSERT (i == 6);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
}
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    85
void 
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    86
Mac48Address::CopyFrom (const uint8_t buffer[6])
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    87
{
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    88
  memcpy (m_address, buffer, 6);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    89
}
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    90
void 
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    91
Mac48Address::CopyTo (uint8_t buffer[6]) const
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    92
{
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    93
  memcpy (buffer, m_address, 6);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    94
}
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
    95
1173
06e382cadbbb add Ipv4Address::IsMatchingType and Eui48Address::IsMatchingType
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1170
diff changeset
    96
bool 
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
    97
Mac48Address::IsMatchingType (const Address &address)
1173
06e382cadbbb add Ipv4Address::IsMatchingType and Eui48Address::IsMatchingType
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1170
diff changeset
    98
{
06e382cadbbb add Ipv4Address::IsMatchingType and Eui48Address::IsMatchingType
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1170
diff changeset
    99
  return address.CheckCompatible (GetType (), 6);
06e382cadbbb add Ipv4Address::IsMatchingType and Eui48Address::IsMatchingType
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1170
diff changeset
   100
}
1705
ae9623064367 constify conversion operator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1494
diff changeset
   101
Mac48Address::operator Address () const
1205
6cee0d34bda6 add implicit conversion to Eui48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1173
diff changeset
   102
{
6cee0d34bda6 add implicit conversion to Eui48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1173
diff changeset
   103
  return ConvertTo ();
6cee0d34bda6 add implicit conversion to Eui48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1173
diff changeset
   104
}
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
Address 
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   106
Mac48Address::ConvertTo (void) const
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
  return Address (GetType (), m_address, 6);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
}
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   110
Mac48Address 
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   111
Mac48Address::ConvertFrom (const Address &address)
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
{
1159
eef87ec51ad7 improve type checking
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1158
diff changeset
   113
  NS_ASSERT (address.CheckCompatible (GetType (), 6));
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   114
  Mac48Address retval;
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
  address.CopyTo (retval.m_address);
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
  return retval;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
}
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   118
Mac48Address 
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   119
Mac48Address::Allocate (void)
1161
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   120
{
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   121
  static uint64_t id = 0;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   122
  id++;
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   123
  Mac48Address address;
1179
45fc6b70b9cc fix bugless in address allocation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1173
diff changeset
   124
  address.m_address[0] = (id >> 40) & 0xff;
1161
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   125
  address.m_address[1] = (id >> 32) & 0xff;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   126
  address.m_address[2] = (id >> 24) & 0xff;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   127
  address.m_address[3] = (id >> 16) & 0xff;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   128
  address.m_address[4] = (id >> 8) & 0xff;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   129
  address.m_address[5] = (id >> 0) & 0xff;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   130
  return address;
bb72baff8b26 replace MacAddress by Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1159
diff changeset
   131
}
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
uint8_t 
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   133
Mac48Address::GetType (void)
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
{
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
  static uint8_t type = Address::Register ();
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
  return type;
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
}
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   139
bool
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   140
Mac48Address::IsBroadcast (void) const
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   141
{
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   142
  return *this == GetBroadcast ();
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   143
}
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   144
bool 
3549
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   145
Mac48Address::IsGroup (void) const
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   146
{
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   147
  return (m_address[0] & 0x01) == 0x01;
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   148
}
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   149
Mac48Address
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   150
Mac48Address::GetBroadcast (void)
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   151
{
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   152
  static Mac48Address broadcast = Mac48Address ("ff:ff:ff:ff:ff:ff");
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   153
  return broadcast;
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   154
}
3549
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   155
Mac48Address 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   156
Mac48Address::GetMulticastPrefix (void)
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   157
{
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   158
  static Mac48Address multicast = Mac48Address ("01:00:5e:00:00:00");
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   159
  return multicast;
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   160
}
3852
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   161
Mac48Address
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   162
Mac48Address::GetMulticast6Prefix (void)
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   163
{
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   164
  static Mac48Address multicast = Mac48Address ("33:33:00:00:00:00");
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   165
  return multicast;
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   166
}
3549
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   167
Mac48Address 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   168
Mac48Address::GetMulticast (Ipv4Address multicastGroup)
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   169
{
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   170
  Mac48Address etherAddr = Mac48Address::GetMulticastPrefix ();
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   171
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   172
  // We now have the multicast address in an abstract 48-bit container.  We 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   173
  // need to pull it out so we can play with it.  When we're done, we have the 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   174
  // high order bits in etherBuffer[0], etc.
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   175
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   176
  uint8_t etherBuffer[6];
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   177
  etherAddr.CopyTo (etherBuffer);
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   178
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   179
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   180
  // Now we need to pull the raw bits out of the Ipv4 destination address.
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   181
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   182
  uint8_t ipBuffer[4];
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   183
  multicastGroup.Serialize (ipBuffer);
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   184
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   185
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   186
  // RFC 1112 says that an Ipv4 host group address is mapped to an EUI-48
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   187
  // multicast address by placing the low-order 23-bits of the IP address into 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   188
  // the low-order 23 bits of the Ethernet multicast address 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   189
  // 01-00-5E-00-00-00 (hex). 
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   190
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   191
  etherBuffer[3] |= ipBuffer[1] & 0x7f;
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   192
  etherBuffer[4] = ipBuffer[2];
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   193
  etherBuffer[5] = ipBuffer[3];
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   194
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   195
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   196
  // Now, etherBuffer has the desired ethernet multicast address.  We have to
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   197
  // suck these bits back into the Mac48Address,
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   198
  //
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   199
  Mac48Address result;
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   200
  result.CopyFrom (etherBuffer);
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   201
  return result;
4eaf02702f17 shared Mac48 multicast code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3365
diff changeset
   202
}
3852
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   203
Mac48Address Mac48Address::GetMulticast(Ipv6Address addr)
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   204
{
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   205
  Mac48Address etherAddr = Mac48Address::GetMulticast6Prefix();
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   206
  uint8_t etherBuffer[6];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   207
  uint8_t ipBuffer[16];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   208
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   209
  /* a MAC multicast IPv6 address is like 33:33 and the four low bytes */
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   210
  /* for 2001:db8::2fff:fe11:ac10 => 33:33:FE:11:AC:10 */
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   211
  etherAddr.CopyTo (etherBuffer);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   212
  addr.Serialize (ipBuffer);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   213
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   214
  etherBuffer[2] = ipBuffer[12];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   215
  etherBuffer[3] = ipBuffer[13];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   216
  etherBuffer[4] = ipBuffer[14];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   217
  etherBuffer[5] = ipBuffer[15];
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   218
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   219
  etherAddr.CopyFrom (etherBuffer);
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   220
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   221
  return etherAddr;
9cf7ad0cac85 Initial IPv6 capability
vincent@clarinet.u-strasbg.fr
parents: 3549
diff changeset
   222
}
2411
a50e95c98d3f add Value support to Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1953
diff changeset
   223
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   224
bool operator == (const Mac48Address &a, const Mac48Address &b)
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   225
{
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   226
  return memcmp (a.m_address, b.m_address, 6) == 0;
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   227
}
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   228
bool operator != (const Mac48Address &a, const Mac48Address &b)
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   229
{
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   230
  return ! (a == b);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   231
}
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   232
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   233
bool operator < (const Mac48Address &a, const Mac48Address &b)
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   234
{
1926
88023edeb6ea add operator <
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1907
diff changeset
   235
  uint8_t aP[6];
88023edeb6ea add operator <
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1907
diff changeset
   236
  uint8_t bP[6];
88023edeb6ea add operator <
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1907
diff changeset
   237
  a.CopyTo (aP);
88023edeb6ea add operator <
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1907
diff changeset
   238
  b.CopyTo (bP);
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   239
  for (uint8_t i = 0; i < 6; i++) 
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   240
    {
1953
5c7eb973beb2 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1932 1707
diff changeset
   241
       if (a.m_address[i] < b.m_address[i]) 
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   242
        {
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   243
          return true;
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   244
        } 
1953
5c7eb973beb2 merge with HEAD
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1932 1707
diff changeset
   245
       else if (a.m_address[i] > b.m_address[i]) 
1707
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   246
        {
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   247
          return false;
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   248
        }
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   249
    }
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   250
  return false;
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   251
}
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   252
64531b6e76f1 bug 86: add missing functions to manipulate Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1705
diff changeset
   253
1494
c2985e1cd091 rename Euixx to Macxx
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1270
diff changeset
   254
std::ostream& operator<< (std::ostream& os, const Mac48Address & address)
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   255
{
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   256
  uint8_t ad[6];
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   257
  address.CopyTo (ad);
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   258
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   259
  os.setf (std::ios::hex, std::ios::basefield);
1262
8e3d39fa3565 fix trace output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1181
diff changeset
   260
  os.fill('0');
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   261
  for (uint8_t i=0; i < 5; i++) 
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   262
    {
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   263
      os << std::setw(2) << (uint32_t)ad[i] << ":";
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   264
    }
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   265
  // Final byte not suffixed by ":"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   266
  os << std::setw(2) << (uint32_t)ad[5];
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   267
  os.setf (std::ios::dec, std::ios::basefield);
1262
8e3d39fa3565 fix trace output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1181
diff changeset
   268
  os.fill(' ');
1167
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   269
  return os;
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   270
}
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1161
diff changeset
   271
2954
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   272
static uint8_t
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   273
AsInt (std::string v)
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   274
{
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   275
  std::istringstream iss;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   276
  iss.str (v);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   277
  uint32_t retval;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   278
  iss >> std::hex >> retval >> std::dec;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   279
  return retval;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   280
}
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   281
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   282
std::istream& operator>> (std::istream& is, Mac48Address & address)
2411
a50e95c98d3f add Value support to Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1953
diff changeset
   283
{
2954
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   284
  std::string v;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   285
  is >> v;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   286
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   287
  std::string::size_type col = 0;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   288
  for (uint8_t i = 0; i < 6; ++i)
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   289
    {
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   290
      std::string tmp;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   291
      std::string::size_type next;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   292
      next = v.find (":", col);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   293
      if (next == std::string::npos)
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   294
	{
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   295
	  tmp = v.substr (col, v.size ()-col);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   296
	  address.m_address[i] = AsInt (tmp);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   297
	  break;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   298
	}
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   299
      else
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   300
	{
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   301
	  tmp = v.substr (col, next-col);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   302
	  address.m_address[i] = AsInt (tmp);
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   303
	  col = next + 1;
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   304
	}
a1a6028e4c39 implement operator >>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2582
diff changeset
   305
    }
2411
a50e95c98d3f add Value support to Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1953
diff changeset
   306
  return is;
a50e95c98d3f add Value support to Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1953
diff changeset
   307
}
a50e95c98d3f add Value support to Mac48Address
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1953
diff changeset
   308
1158
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   309
12d68dff3353 new address types
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   310
} // namespace ns3