base: fix some bugs in EthAddr
per the IEEE 802 spec: 1) fixed broadcast() to ensure that all bytes are equal to 0xff. 2) fixed unicast() to ensure that bit 0 of the first byte is equal to 0 3) fixed multicast() to ensure that bit 0 of the first byte is equal to 1, and that it is not a broadcast. also the constructors in EthAddr are fixed so that all bytes of data are initialized.
This commit is contained in:
parent
b998a0c6ac
commit
3956ec0a89
2 changed files with 16 additions and 5 deletions
|
@ -62,12 +62,14 @@ EthAddr::EthAddr()
|
|||
|
||||
EthAddr::EthAddr(const uint8_t ea[ETH_ADDR_LEN])
|
||||
{
|
||||
*data = *ea;
|
||||
for (int i = 0; i < ETH_ADDR_LEN; ++i)
|
||||
data[i] = ea[i];
|
||||
}
|
||||
|
||||
EthAddr::EthAddr(const eth_addr &ea)
|
||||
{
|
||||
*data = *ea.data;
|
||||
for (int i = 0; i < ETH_ADDR_LEN; ++i)
|
||||
data[i] = ea.data[i];
|
||||
}
|
||||
|
||||
EthAddr::EthAddr(const std::string &addr)
|
||||
|
|
|
@ -93,9 +93,18 @@ struct EthAddr : protected eth_addr
|
|||
uint8_t *bytes() { return &data[0]; }
|
||||
|
||||
const uint8_t *addr() const { return &data[0]; }
|
||||
bool unicast() const { return data[0] == 0x00; }
|
||||
bool multicast() const { return data[0] == 0x01; }
|
||||
bool broadcast() const { return data[0] == 0xff; }
|
||||
bool unicast() const { return !(data[0] & 0x01); }
|
||||
bool multicast() const { return !unicast() && !broadcast(); }
|
||||
bool broadcast() const
|
||||
{
|
||||
bool isBroadcast = true;
|
||||
for (int i = 0; i < ETH_ADDR_LEN; ++i) {
|
||||
isBroadcast = isBroadcast && data[i] == 0xff;
|
||||
}
|
||||
|
||||
return isBroadcast;
|
||||
}
|
||||
|
||||
std::string string() const;
|
||||
|
||||
operator uint64_t() const
|
||||
|
|
Loading…
Reference in a new issue