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:
Anthony Gutierrez 2014-07-02 13:19:13 -04:00
parent b998a0c6ac
commit 3956ec0a89
2 changed files with 16 additions and 5 deletions

View file

@ -62,12 +62,14 @@ EthAddr::EthAddr()
EthAddr::EthAddr(const uint8_t ea[ETH_ADDR_LEN]) 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) 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) EthAddr::EthAddr(const std::string &addr)

View file

@ -93,9 +93,18 @@ struct EthAddr : protected eth_addr
uint8_t *bytes() { return &data[0]; } uint8_t *bytes() { return &data[0]; }
const uint8_t *addr() const { return &data[0]; } const uint8_t *addr() const { return &data[0]; }
bool unicast() const { return data[0] == 0x00; } bool unicast() const { return !(data[0] & 0x01); }
bool multicast() const { return data[0] == 0x01; } bool multicast() const { return !unicast() && !broadcast(); }
bool broadcast() const { return data[0] == 0xff; } 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; std::string string() const;
operator uint64_t() const operator uint64_t() const