| /* |
| * 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; |
| } |