57#ifndef OPENVPN_APPLECRYPTO_UTIL_REACHABLE_H
58#define OPENVPN_APPLECRYPTO_UTIL_REACHABLE_H
60#import "TargetConditionals.h"
62#include <netinet/in.h>
63#include <SystemConfiguration/SCNetworkReachability.h>
75#pragma clang diagnostic push
76#pragma clang diagnostic ignored "-Wdeprecated-declarations"
79OPENVPN_CF_WRAP(NetworkReachability, network_reachability_cast, SCNetworkReachabilityRef, SCNetworkReachabilityGetTypeID);
83#pragma clang diagnostic pop
102 std::string
to_string(
const SCNetworkReachabilityFlags
f)
const
121#if defined(__APPLE__)
122#pragma clang diagnostic push
123#pragma clang diagnostic ignored "-Wdeprecated-declarations"
125 SCNetworkReachabilityFlags
flags()
const
127 SCNetworkReachabilityFlags
f = 0;
128 if (SCNetworkReachabilityGetFlags(
reach(), &
f) == TRUE)
133#if defined(__APPLE__)
134#pragma clang diagnostic pop
155 return "NotReachable";
157 return "ReachableViaWiFi";
159 return "ReachableViaWWAN";
161 return "ReachableVia???";
168#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
169 if (
flags & kSCNetworkReachabilityFlagsIsWWAN)
174 if (
flags & kSCNetworkReachabilityFlagsReachable)
179 if (
flags & kSCNetworkReachabilityFlagsTransientConnection)
183 if (
flags & kSCNetworkReachabilityFlagsConnectionRequired)
187 if (
flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)
191 if (
flags & kSCNetworkReachabilityFlagsInterventionRequired)
195 if (
flags & kSCNetworkReachabilityFlagsConnectionOnDemand)
199 if (
flags & kSCNetworkReachabilityFlagsIsLocalAddress)
203 if (
flags & kSCNetworkReachabilityFlagsIsDirect)
221#if defined(__APPLE__)
222#pragma clang diagnostic push
223#pragma clang diagnostic ignored "-Wdeprecated-declarations"
227 struct sockaddr_in addr;
228 bzero(&addr,
sizeof(addr));
229 addr.sin_len =
sizeof(addr);
230 addr.sin_family = AF_INET;
231 reach.reset(SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (
struct sockaddr *)&addr));
233#if defined(__APPLE__)
234#pragma clang diagnostic pop
249 if ((
flags & kSCNetworkReachabilityFlagsReachable) == 0)
257 if ((
flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
265 if ((((
flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
266 (
flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
271 if ((
flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
279#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
280 if ((
flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
297 struct sockaddr_in addr;
298 bzero(&addr,
sizeof(addr));
299 addr.sin_len =
sizeof(addr);
300 addr.sin_family = AF_INET;
301 addr.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM);
302#if defined(__APPLE__)
303#pragma clang diagnostic push
304#pragma clang diagnostic ignored "-Wdeprecated-declarations"
306 reach.reset(SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (
struct sockaddr *)&addr));
307#if defined(__APPLE__)
308#pragma clang diagnostic pop
325 if ((
flags & kSCNetworkReachabilityFlagsReachable) && (
flags & kSCNetworkReachabilityFlagsIsDirect))
380 if (net_type ==
"cellular")
382 else if (net_type ==
"wifi")
401 std::unique_ptr<ReachabilityViaWiFi>
wifi;
447 SCNetworkReachabilityContext context = {0,
this,
nullptr,
nullptr,
nullptr};
448 if (rb.
reach.defined())
450#if defined(__APPLE__)
451#pragma clang diagnostic push
452#pragma clang diagnostic ignored "-Wdeprecated-declarations"
454 if (SCNetworkReachabilitySetCallback(rb.
reach(),
459 if (SCNetworkReachabilityScheduleWithRunLoop(rb.
reach(),
460 CFRunLoopGetCurrent(),
461 kCFRunLoopCommonModes)
465#if defined(__APPLE__)
466#pragma clang diagnostic pop
473#if defined(__APPLE__)
474#pragma clang diagnostic push
475#pragma clang diagnostic ignored "-Wdeprecated-declarations"
479 if (rb.
reach.defined())
480 SCNetworkReachabilityUnscheduleFromRunLoop(rb.
reach(), CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
482#if defined(__APPLE__)
483#pragma clang diagnostic pop
487 SCNetworkReachabilityFlags
flags,
495 SCNetworkReachabilityFlags
flags,
#define OPENVPN_CF_WRAP(cls, castmeth, cftype, idmeth)
virtual Status vstatus(const SCNetworkReachabilityFlags flags) const =0
static std::string render_type(Type type)
std::string to_string() const
SCNetworkReachabilityFlags flags() const
static std::string render_flags(const SCNetworkReachabilityFlags flags)
CF::NetworkReachability reach
std::string to_string(const SCNetworkReachabilityFlags f) const
virtual ~ReachabilityBase()=default
virtual Type vtype() const =0
ReachabilityInterface::Status Status
static std::string render_status(const Status status)
bool schedule(ReachabilityBase &rb, SCNetworkReachabilityCallBack cb)
void cancel(ReachabilityBase &rb)
ReachabilityTracker(const bool enable_internet, const bool enable_wifi)
virtual ~ReachabilityTracker()
void reachability_tracker_schedule()
virtual void reachability_tracker_event(const ReachabilityBase &rb, SCNetworkReachabilityFlags flags)=0
static void internet_callback_static(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info)
Reachability reachability
static void wifi_callback_static(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info)
void reachability_tracker_cancel()
ReachabilityViaInternet()
static Status status_from_flags(const SCNetworkReachabilityFlags flags)
Status vstatus(const SCNetworkReachabilityFlags flags) const override
Type vtype() const override
Type vtype() const override
Status vstatus(const SCNetworkReachabilityFlags flags) const override
static Status status_from_flags(const SCNetworkReachabilityFlags flags)
bool reachableViaCellular() const
std::unique_ptr< ReachabilityViaWiFi > wifi
std::unique_ptr< ReachabilityViaInternet > internet
std::string to_string() const override
bool reachableViaWiFi() const
Status reachable() const override
Reachability(const bool enable_internet, const bool enable_wifi)
bool reachableVia(const std::string &net_type) const override