Skip to content

Commit a636f0b

Browse files
committed
Redphone works on ipv6 only network
// FREEBIE
1 parent ce18be2 commit a636f0b

File tree

5 files changed

+86
-6
lines changed

5 files changed

+86
-6
lines changed

Signal/src/network/IpAddress.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
+(IpAddress*) ipv4AddressFromSockaddr:(struct sockaddr_in)sockaddr;
2828
+(IpAddress*) ipv6AddressFromSockaddr:(struct sockaddr_in6)sockaddr;
2929

30+
@property (nonatomic, readonly) bool isIpv4;
31+
@property (nonatomic, readonly) bool isIpv6;
32+
3033
-(IpEndPoint*) withPort:(in_port_t)port;
3134
-(NSData*) sockaddrData;
3235
-(NSData*) sockaddrDataWithPort:(in_port_t)port;

Signal/src/network/IpAddress.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ +(IpAddress*) ipv6AddressFromSockaddr:(struct sockaddr_in6)sockaddr {
8080
return a;
8181
}
8282

83+
- (bool)isIpv4
84+
{
85+
return isIpv4;
86+
}
87+
88+
- (bool)isIpv6
89+
{
90+
return isIpv6;
91+
}
92+
8393
-(IpEndPoint*) withPort:(in_port_t)port {
8494
return [IpEndPoint ipEndPointAtAddress:self onPort:port];
8595
}

Signal/src/network/IpEndPoint.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@
2121
+(IpEndPoint*) ipEndPointAtAddress:(IpAddress*)address
2222
onPort:(in_port_t)port;
2323

24-
+(IpEndPoint*) ipEndPointAtUnspecifiedAddressOnPort:(in_port_t)port;
24+
+ (IpEndPoint *)ipv4EndPointAtUnspecifiedAddressOnPort:(in_port_t)port;
25+
+ (IpEndPoint *)ipv6EndPointAtUnspecifiedAddressOnPort:(in_port_t)port;
2526

2627
+(IpEndPoint*) ipEndPointFromSockaddrData:(NSData*)sockaddrData;
2728
+(IpEndPoint*) ipv4EndPointFromSockaddrData:(NSData*)sockaddrData;
2829
+(IpEndPoint*) ipv6EndPointFromSockaddrData:(NSData*)sockaddrData;
2930

31+
- (IpEndPoint *)correspondingLocalEndpointWithPort:(in_port_t)specifiedLocalPort;
32+
3033
-(in_port_t) port;
3134
-(IpAddress*) address;
3235
-(NSData*) sockaddrData;

Signal/src/network/IpEndPoint.m

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ +(IpEndPoint*) ipEndPointAtAddress:(IpAddress*)address
1414
return p;
1515
}
1616

17-
+(IpEndPoint*) ipEndPointAtUnspecifiedAddressOnPort:(in_port_t)port {
17+
+ (IpEndPoint *)ipv4EndPointAtUnspecifiedAddressOnPort:(in_port_t)port
18+
{
1819
struct sockaddr_in s;
1920
memset(&s, 0, sizeof(struct sockaddr_in));
2021
s.sin_len = sizeof(struct sockaddr_in);
@@ -27,6 +28,20 @@ +(IpEndPoint*) ipEndPointAtUnspecifiedAddressOnPort:(in_port_t)port {
2728
return a;
2829
}
2930

31+
+ (IpEndPoint *)ipv6EndPointAtUnspecifiedAddressOnPort:(in_port_t)port
32+
{
33+
struct sockaddr_in6 address;
34+
bzero(&address, sizeof(address));
35+
address.sin6_len = sizeof(address);
36+
address.sin6_family = AF_INET6;
37+
address.sin6_port = htons(port);
38+
39+
IpEndPoint *a = [IpEndPoint new];
40+
a->address = [IpAddress ipv6AddressFromString:@"0:0:0:0:0:0:0:0"];
41+
a->port = port;
42+
return a;
43+
}
44+
3045
+(IpEndPoint*) ipEndPointFromSockaddrData:(NSData*)sockaddrData {
3146
ows_require(sockaddrData != nil);
3247
ows_require(sockaddrData.length >= sizeof(struct sockaddr));
@@ -59,6 +74,17 @@ +(IpEndPoint*) ipv6EndPointFromSockaddrData:(NSData*)sockaddrData {
5974
return [[IpAddress ipv6AddressFromSockaddr:s] withPort:ntohs(s.sin6_port)];
6075
}
6176

77+
- (IpEndPoint *)correspondingLocalEndpointWithPort:(in_port_t)specifiedLocalPort
78+
{
79+
if (self.address.isIpv4) {
80+
DDLogDebug(@"%@ Connecting via IPv4", self.tag);
81+
return [IpEndPoint ipv4EndPointAtUnspecifiedAddressOnPort:specifiedLocalPort];
82+
} else {
83+
DDLogDebug(@"%@ Connecting via IPv6", self.tag);
84+
return [IpEndPoint ipv6EndPointAtUnspecifiedAddressOnPort:specifiedLocalPort];
85+
}
86+
}
87+
6288
-(IpAddress*) address {
6389
return address;
6490
}
@@ -92,4 +118,16 @@ -(TOCFuture*) asyncResolveToSpecificEndPointsUnlessCancelled:(TOCCancelToken*)un
92118
return [TOCFuture futureWithResult:@[self]];
93119
}
94120

121+
#pragma mark - Logging
122+
123+
+ (NSString *)tag
124+
{
125+
return [NSString stringWithFormat:@"[%@]", self.class];
126+
}
127+
128+
- (NSString *)tag
129+
{
130+
return self.class.tag;
131+
}
132+
95133
@end

Signal/src/network/udp/UdpSocket.m

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#import "Constraints.h"
22
#import "ThreadManager.h"
33
#import "UdpSocket.h"
4+
#import "IPAddress.h"
45

56
@implementation UdpSocket
67

@@ -131,8 +132,14 @@ -(void) onConnectFrom:(CFDataRef)addressData {
131132
}
132133

133134
-(void) setupLocalEndPoint {
134-
IpEndPoint* specifiedLocalEndPoint = [IpEndPoint ipEndPointAtUnspecifiedAddressOnPort:specifiedLocalPort];
135-
135+
IpEndPoint *specifiedLocalEndPoint;
136+
if (self.isRemoteEndPointKnown) {
137+
specifiedLocalEndPoint = [specifiedRemoteEndPoint correspondingLocalEndpointWithPort:specifiedLocalPort];
138+
} else {
139+
DDLogWarn(@"%@ no remote end point. This is only used in unit tests.", self.tag);
140+
specifiedLocalEndPoint = [IpEndPoint ipv4EndPointAtUnspecifiedAddressOnPort:specifiedLocalPort];
141+
}
142+
136143
CFSocketError setAddressResult = CFSocketSetAddress(socket, (__bridge CFDataRef)[specifiedLocalEndPoint sockaddrData]);
137144
checkOperationDescribe(setAddressResult == kCFSocketSuccess,
138145
([NSString stringWithFormat:@"CFSocketSetAddress failed with error code: %ld", setAddressResult]));
@@ -165,9 +172,16 @@ -(void) startWithHandler:(PacketHandler*)handler
165172

166173
@try {
167174
CFSocketContext socketContext = { 0, (__bridge void *)self, CFRetain, CFRelease, CFCopyDescription };
168-
175+
176+
SInt32 protocolFamily;
177+
if (self.isRemoteEndPointKnown) {
178+
protocolFamily = specifiedRemoteEndPoint.address.isIpv4 ? PF_INET : PF_INET6;
179+
} else {
180+
DDLogWarn(@"Uknown remote endpoint. This is only used in testing.");
181+
protocolFamily = PF_INET;
182+
}
169183
socket = CFSocketCreate(kCFAllocatorDefault,
170-
PF_INET,
184+
protocolFamily,
171185
SOCK_DGRAM,
172186
IPPROTO_UDP,
173187
kCFSocketDataCallBack,
@@ -194,4 +208,16 @@ -(void) startWithHandler:(PacketHandler*)handler
194208
}
195209
}
196210

211+
#pragma mark - Logging
212+
213+
+ (NSString *)tag
214+
{
215+
return [NSString stringWithFormat:@"[%@]", self.class];
216+
}
217+
218+
- (NSString *)tag
219+
{
220+
return self.class.tag;
221+
}
222+
197223
@end

0 commit comments

Comments
 (0)