Sfoglia il codice sorgente

Reduce BindToDevice diagnostic logging overhead

- Return diagnostic info from BindToDevice
  call to log within tunnel-core without any
  additional CGO round trip

- No longer logging all active interfaces
Rod Hynes 8 anni fa
parent
commit
98301e4cd4

+ 11 - 12
MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel/PsiphonTunnel.m

@@ -832,31 +832,32 @@
 
 #pragma mark - GoPsiPsiphonProvider protocol implementation (private)
 
-- (BOOL)bindToDevice:(long)fileDescriptor error:(NSError **)error {
+- (NSString *)bindToDevice:(long)fileDescriptor error:(NSError **)error {
+
     if (!self->tunnelWholeDevice) {
-        return FALSE;
+        *error = [[NSError alloc] initWithDomain:@"iOSLibrary" code:1 userInfo:@{NSLocalizedDescriptionKey: @"bindToDevice: invalid mode"}];
+        return @"";
     }
     
     NSString *activeInterface = [self getActiveInterface];
     if (activeInterface == nil) {
-        return FALSE;
+        *error = [[NSError alloc] initWithDomain:@"iOSLibrary" code:1 userInfo:@{NSLocalizedDescriptionKey: @"bindToDevice: not active interface"}];
+        return @"";
     }
-    [self logMessage:[NSString stringWithFormat:@"bindToDevice: Active interface: %@", activeInterface]];
     
     unsigned int interfaceIndex = if_nametoindex([activeInterface UTF8String]);
     if (interfaceIndex == 0) {
-        // if_nametoindex returns 0 on error.
-        [self logMessage:[NSString stringWithFormat:@"bindToDevice: if_nametoindex error for interface (%@)", activeInterface]];
-        return FALSE;
+        *error = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:@{NSLocalizedDescriptionKey: @"bindToDevice: if_nametoindex failed"}];
+        return @"";
     }
     
     int ret = setsockopt((int)fileDescriptor, IPPROTO_IP, IP_BOUND_IF, &interfaceIndex, sizeof(interfaceIndex));
     if (ret != 0) {
-        [self logMessage:[NSString stringWithFormat: @"bindToDevice: setsockopt failed; errno: %d", errno]];
-        return FALSE;
+        *error = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:@{NSLocalizedDescriptionKey: @"bindToDevice: setsockopt failed"}];
+        return @"";
     }
     
-    return TRUE;
+    return [NSString stringWithFormat:@"active interface: %@", activeInterface];
 }
 
 /*!
@@ -890,8 +891,6 @@
     // Free getifaddrs data
     freeifaddrs(interfaces);
     
-    [self logMessage:[NSString stringWithFormat:@"getActiveInterface: List of UP interfaces: %@", upIffList]];
-    
     // TODO: following is a heuristic for choosing active network interface
     // Only Wi-Fi and Cellular interfaces are considered
     // @see : https://forums.developer.apple.com/thread/76711

+ 19 - 3
MobileLibrary/psi/psi.go

@@ -39,7 +39,7 @@ import (
 type PsiphonProvider interface {
 	Notice(noticeJSON string)
 	HasNetworkConnectivity() int
-	BindToDevice(fileDescriptor int) error
+	BindToDevice(fileDescriptor int) (string, error)
 	IPv6Synthesize(IPv4Addr string) string
 	GetPrimaryDnsServer() string
 	GetSecondaryDnsServer() string
@@ -84,7 +84,7 @@ func Start(
 	config.NetworkConnectivityChecker = provider
 
 	if useDeviceBinder {
-		config.DeviceBinder = provider
+		config.DeviceBinder = newLoggingDeviceBinder(provider)
 		config.DnsServerGetter = provider
 	}
 
@@ -255,7 +255,7 @@ func (p *mutexPsiphonProvider) HasNetworkConnectivity() int {
 	return p.p.HasNetworkConnectivity()
 }
 
-func (p *mutexPsiphonProvider) BindToDevice(fileDescriptor int) error {
+func (p *mutexPsiphonProvider) BindToDevice(fileDescriptor int) (string, error) {
 	p.Lock()
 	defer p.Unlock()
 	return p.p.BindToDevice(fileDescriptor)
@@ -278,3 +278,19 @@ func (p *mutexPsiphonProvider) GetSecondaryDnsServer() string {
 	defer p.Unlock()
 	return p.p.GetSecondaryDnsServer()
 }
+
+type loggingDeviceBinder struct {
+	p PsiphonProvider
+}
+
+func newLoggingDeviceBinder(p PsiphonProvider) *loggingDeviceBinder {
+	return &loggingDeviceBinder{p: p}
+}
+
+func (d *loggingDeviceBinder) BindToDevice(fileDescriptor int) error {
+	deviceInfo, err := d.p.BindToDevice(fileDescriptor)
+	if err == nil && deviceInfo != "" {
+		NoticeInfo("BindToDevice: %s", deviceInfo)
+	}
+	return err
+}