From 8bfd1088d5ae78ab071df0273317a7c0944fab89 Mon Sep 17 00:00:00 2001 From: Jonatan Chaverri Date: Tue, 24 Sep 2024 12:19:07 -0400 Subject: [PATCH] add support for ipv4 peers --- src/network/message/utils.zig | 18 ++++++++++++++++++ src/network/peer.zig | 7 +++++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/network/message/utils.zig diff --git a/src/network/message/utils.zig b/src/network/message/utils.zig new file mode 100644 index 0000000..2314ca0 --- /dev/null +++ b/src/network/message/utils.zig @@ -0,0 +1,18 @@ +const std = @import("std"); + +pub fn convertIPv4ToIPv6(address: std.net.Address) std.net.Address { + // Convert IPv4 to IPv6-mapped IPv4 address + const ipv4_address = address.in; + + var ipv6_mapped: [16]u8 = [_]u8{0} ** 16; + + // Set bytes 10 and 11 to 0xff + ipv6_mapped[10] = 0xff; + ipv6_mapped[11] = 0xff; + + // Copy the IPv4 address into the last 4 bytes of the IPv6-mapped address + const ipv4_bytes = std.mem.asBytes(&ipv4_address.sa.addr); + @memcpy(ipv6_mapped[12..16], ipv4_bytes[0..4]); + + return std.net.Address.initIp6(ipv6_mapped, ipv4_address.getPort(), 0, 0); +} diff --git a/src/network/peer.zig b/src/network/peer.zig index e281efa..4a2b8a8 100644 --- a/src/network/peer.zig +++ b/src/network/peer.zig @@ -3,6 +3,7 @@ const net = std.net; const protocol = @import("./protocol/lib.zig"); const wire = @import("./wire/lib.zig"); const Config = @import("../config/config.zig").Config; +const MessageUtils = @import("./message/utils.zig"); pub const Boundness = enum { inbound, @@ -89,11 +90,13 @@ pub const Peer = struct { } /// Send version message to peer - fn sendVersionMessage(self: *Peer) !void { + fn sendVersionMessage(self: *const Peer) !void { + const address = if (self.address.any.family == std.posix.AF.INET) MessageUtils.convertIPv4ToIPv6(self.address) else self.address; + const message = protocol.messages.VersionMessage.new( self.config.protocol_version, .{ .ip = std.mem.zeroes([16]u8), .port = 0, .services = self.config.services }, - .{ .ip = self.address.in6.sa.addr, .port = self.address.in6.getPort(), .services = 0 }, + .{ .ip = address.in6.sa.addr, .port = address.in6.getPort(), .services = 0 }, std.crypto.random.int(u64), self.config.bestBlock(), );