network: track socket addresses
This commit is contained in:
@@ -24,6 +24,7 @@ pub const AcceptError = error{
|
|||||||
} || Allocator.Error;
|
} || Allocator.Error;
|
||||||
|
|
||||||
pub const ConnectError = error{
|
pub const ConnectError = error{
|
||||||
|
AddressNotAvailable,
|
||||||
UnavailableHost,
|
UnavailableHost,
|
||||||
PeerNotListeningOnAddress,
|
PeerNotListeningOnAddress,
|
||||||
} || Allocator.Error;
|
} || Allocator.Error;
|
||||||
@@ -52,6 +53,8 @@ pub const ConnSocket = struct {
|
|||||||
// See comment on ListenSocket
|
// See comment on ListenSocket
|
||||||
host: *Host,
|
host: *Host,
|
||||||
|
|
||||||
|
local_address: Address,
|
||||||
|
remote_address: Address,
|
||||||
peer_listen: ?*ListenSocket,
|
peer_listen: ?*ListenSocket,
|
||||||
peer_conn: ?*ConnSocket,
|
peer_conn: ?*ConnSocket,
|
||||||
|
|
||||||
@@ -144,6 +147,15 @@ pub const Host = struct {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn sourceAddress(self: *Host) ConnectError!Address {
|
||||||
|
if (self.available_addresses_ipv4.len == 0)
|
||||||
|
return ConnectError.AddressNotAvailable;
|
||||||
|
return .{
|
||||||
|
.ipv4 = self.available_addresses_ipv4[0],
|
||||||
|
.port = 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn listen(self: *Host, address: Address, socket: *ListenSocket) ListenError!void {
|
pub fn listen(self: *Host, address: Address, socket: *ListenSocket) ListenError!void {
|
||||||
if (!self.isAddressAvailable(address.ipv4))
|
if (!self.isAddressAvailable(address.ipv4))
|
||||||
return ListenError.AddressNotAvailable;
|
return ListenError.AddressNotAvailable;
|
||||||
@@ -169,6 +181,8 @@ pub const Host = struct {
|
|||||||
errdefer self.unlinkConnSocket(new_socket);
|
errdefer self.unlinkConnSocket(new_socket);
|
||||||
|
|
||||||
// Initialize other fields
|
// Initialize other fields
|
||||||
|
new_socket.local_address = socket.address;
|
||||||
|
new_socket.remote_address = peer_socket.local_address;
|
||||||
new_socket.peer_listen = null;
|
new_socket.peer_listen = null;
|
||||||
new_socket.input_buffer = .empty;
|
new_socket.input_buffer = .empty;
|
||||||
new_socket.pending_output_buffer = .empty;
|
new_socket.pending_output_buffer = .empty;
|
||||||
@@ -201,6 +215,8 @@ pub const Host = struct {
|
|||||||
self.linkConnSocket(new_socket);
|
self.linkConnSocket(new_socket);
|
||||||
errdefer self.unlinkConnSocket(new_socket);
|
errdefer self.unlinkConnSocket(new_socket);
|
||||||
|
|
||||||
|
new_socket.local_address = try self.sourceAddress();
|
||||||
|
new_socket.remote_address = address;
|
||||||
new_socket.peer_listen = listen_socket;
|
new_socket.peer_listen = listen_socket;
|
||||||
new_socket.peer_conn = null;
|
new_socket.peer_conn = null;
|
||||||
new_socket.input_buffer = .empty;
|
new_socket.input_buffer = .empty;
|
||||||
|
|||||||
Reference in New Issue
Block a user