blob: 28487e5d6fb72723c5e5aeca82bbee94c0cb8427 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "Inet4Address.h"
using namespace decaf;
using namespace decaf::net;
////////////////////////////////////////////////////////////////////////////////
Inet4Address::Inet4Address() {
}
////////////////////////////////////////////////////////////////////////////////
Inet4Address::Inet4Address(const unsigned char* ipAddress, int numBytes) :
InetAddress(ipAddress, numBytes) {
}
////////////////////////////////////////////////////////////////////////////////
Inet4Address::Inet4Address(const std::string& hostname, const unsigned char* ipAddress, int numBytes) :
InetAddress(hostname, ipAddress, numBytes) {
}
////////////////////////////////////////////////////////////////////////////////
Inet4Address::~Inet4Address() {
}
////////////////////////////////////////////////////////////////////////////////
InetAddress* Inet4Address::clone() const {
return new Inet4Address(*this);
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isAnyLocalAddress() const {
for (int ix = 0; ix < 4; ix++) {
if (this->addressBytes[ix] != 0) {
return false;
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isLoopbackAddress() const {
return this->addressBytes[0] == 127;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMulticastAddress() const {
return (this->addressBytes[0] & 0xF0) == 0xE0;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isLinkLocalAddress() const {
return ((this->addressBytes[0] == 169) && (this->addressBytes[1] == 254));
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isSiteLocalAddress() const {
return (this->addressBytes[0] == 10) || ((this->addressBytes[0] == 172) && ((this->addressBytes[1] > 15) && (this->addressBytes[1] < 32)))
|| ((this->addressBytes[0] == 192) && (this->addressBytes[1] == 168));
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMCGlobal() const {
// Check if we have a prefix of 1110
if (!isMulticastAddress()) {
return false;
}
unsigned int address = InetAddress::bytesToInt(addressBytes.get(), 0);
// Now check the boundaries of the global space if we have an address
// that is prefixed by something less than 111000000000000000000001
// it is not multicast. ( < 224.0.1.0)
if ((address >> 8) < 0xE00001) {
return false;
}
// Now check the high boundary which is prefixed by 11101110 = 0xEE. If
// the value is higher than this than it is not MCGlobal ( > 238.255.255.255 )
if ((address >> 24) > 0xEE) {
return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMCNodeLocal() const {
// Never true for IPV4
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMCLinkLocal() const {
return (InetAddress::bytesToInt(addressBytes.get(), 0) >> 8) == 0xE00000;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMCSiteLocal() const {
return (InetAddress::bytesToInt(addressBytes.get(), 0) >> 16) == 0xEFFF;
}
////////////////////////////////////////////////////////////////////////////////
bool Inet4Address::isMCOrgLocal() const {
unsigned int prefix = InetAddress::bytesToInt(addressBytes.get(), 0) >> 16;
return prefix >= 0xEFC0 && prefix <= 0xEFC3;
}