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
2047f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#ifndef __ANDROID_VNDK__
2147f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park
226316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <netinet/in.h>
236316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
246316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <binder/Parcelable.h>
256316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/String16.h>
266316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#include <utils/StrongPointer.h>
276316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
286316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace android {
296316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
306316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumnamespace net {
316316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
326316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum/*
336316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum * C++ implementation of the Java class android.net.IpPrefix
346316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum */
356316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumclass IpPrefix : public Parcelable {
366316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic:
376316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    IpPrefix() = default;
386316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    virtual ~IpPrefix() = default;
396316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    IpPrefix(const IpPrefix& prefix) = default;
406316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
416316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    IpPrefix(const struct in6_addr& addr, int32_t plen):
426316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        mUnion(addr), mPrefixLength(plen), mIsIpv6(true) { }
436316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
446316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    IpPrefix(const struct in_addr& addr, int32_t plen):
456316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        mUnion(addr), mPrefixLength(plen), mIsIpv6(false) { }
466316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
476316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool getAddressAsIn6Addr(struct in6_addr* addr) const;
486316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool getAddressAsInAddr(struct in_addr* addr) const;
496316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
506316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    const struct in6_addr& getAddressAsIn6Addr() const;
516316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    const struct in_addr& getAddressAsInAddr() const;
526316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
536316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool isIpv6() const;
546316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool isIpv4() const;
556316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
566316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    int32_t getPrefixLength() const;
576316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
586316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    void setAddress(const struct in6_addr& addr);
596316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    void setAddress(const struct in_addr& addr);
606316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
616316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    void setPrefixLength(int32_t prefix);
626316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
636316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    friend bool operator==(const IpPrefix& lhs, const IpPrefix& rhs);
646316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
656316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    friend bool operator!=(const IpPrefix& lhs, const IpPrefix& rhs) {
666316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        return !(lhs == rhs);
676316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    }
686316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
696316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumpublic:
706316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    // Overrides
716316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t writeToParcel(Parcel* parcel) const override;
726316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    status_t readFromParcel(const Parcel* parcel) override;
736316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
746316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaumprivate:
756316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    union InternalUnion {
7648dd099b53c78eb2f0f53928115a0a2a58485dccRobert Quattlebaum        InternalUnion() = default;
776316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        InternalUnion(const struct in6_addr &addr):mIn6Addr(addr) { };
786316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        InternalUnion(const struct in_addr &addr):mInAddr(addr) { };
796316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        struct in6_addr mIn6Addr;
806316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum        struct in_addr mInAddr;
816316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    } mUnion;
826316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    int32_t mPrefixLength;
836316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum    bool mIsIpv6;
846316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum};
856316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
866316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}  // namespace net
876316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
886316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum}  // namespace android
896316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum
9047f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#else // __ANDROID_VNDK__
9147f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#error "This header is not visible to vendors"
9247f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#endif // __ANDROID_VNDK__
9347f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park
946316f5b8df30422b247c2bfd1a805dcd4069b54eRobert Quattlebaum#endif  // ANDROID_IP_PREFIX_H
95