16316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* 26316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Copyright (C) 2015 The Android Open Source Project 36316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 46316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Licensed under the Apache License, Version 2.0 (the "License"); 56316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * you may not use this file except in compliance with the License. 66316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * You may obtain a copy of the License at 76316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 86316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * http://www.apache.org/licenses/LICENSE-2.0 96316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * 106316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * Unless required by applicable law or agreed to in writing, software 116316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * distributed under the License is distributed on an "AS IS" BASIS, 126316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * See the License for the specific language governing permissions and 146316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * limitations under the License. 156316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum */ 166316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 176316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#ifndef ANDROID_IP_PREFIX_H 186316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#define ANDROID_IP_PREFIX_H 196316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 206316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <netinet/in.h> 216316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Parcelable.h> 236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/String16.h> 246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/StrongPointer.h> 256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace android { 276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace net { 296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/* 316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * C++ implementation of the Java class android.net.IpPrefix 326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum */ 336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass IpPrefix : public Parcelable { 346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic: 356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum IpPrefix() = default; 366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum virtual ~IpPrefix() = default; 376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum IpPrefix(const IpPrefix& prefix) = default; 386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum IpPrefix(const struct in6_addr& addr, int32_t plen): 406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum mUnion(addr), mPrefixLength(plen), mIsIpv6(true) { } 416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum IpPrefix(const struct in_addr& addr, int32_t plen): 436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum mUnion(addr), mPrefixLength(plen), mIsIpv6(false) { } 446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getAddressAsIn6Addr(struct in6_addr* addr) const; 466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool getAddressAsInAddr(struct in_addr* addr) const; 476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum const struct in6_addr& getAddressAsIn6Addr() const; 496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum const struct in_addr& getAddressAsInAddr() const; 506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isIpv6() const; 526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool isIpv4() const; 536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum int32_t getPrefixLength() const; 556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void setAddress(const struct in6_addr& addr); 576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void setAddress(const struct in_addr& addr); 586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum void setPrefixLength(int32_t prefix); 606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum friend bool operator==(const IpPrefix& lhs, const IpPrefix& rhs); 626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum friend bool operator!=(const IpPrefix& lhs, const IpPrefix& rhs) { 646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum return !(lhs == rhs); 656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum } 666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic: 686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum // Overrides 696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum status_t writeToParcel(Parcel* parcel) const override; 706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum status_t readFromParcel(const Parcel* parcel) override; 716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumprivate: 736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum union InternalUnion { 7448dd099b53c78eb2f0f53928115a0a2a58485dccRobert Quattlebaum InternalUnion() = default; 756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum InternalUnion(const struct in6_addr &addr):mIn6Addr(addr) { }; 766316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum InternalUnion(const struct in_addr &addr):mInAddr(addr) { }; 776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum struct in6_addr mIn6Addr; 786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum struct in_addr mInAddr; 796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum } mUnion; 806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum int32_t mPrefixLength; 816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum bool mIsIpv6; 826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}; 836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum} // namespace net 856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum} // namespace android 876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum 886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif // ANDROID_IP_PREFIX_H 89