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