diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2026-04-15 21:02:32 -0400 |
|---|---|---|
| committer | Tangled <noreply@tangled.org> | 2026-04-16 04:56:23 +0300 |
| commit | 91fdb2c6f8d90032f233a0ea65d4b8f4b8d89321 (patch) | |
| tree | ef06c43760fcac9d18b8ab7aa3dd61aa0ed94796 /src | |
| parent | 7077aae9ceedc48fd5329f204163f1fbdd9d0ba8 (diff) | |
refactor: use packed struct for IpAddrdev
This is more intuitive than using u32 directly, and follows the same pattern as the new MAC addr handling
Diffstat (limited to 'src')
| -rw-r--r-- | src/Client.zig | 12 | ||||
| -rw-r--r-- | src/EthIpUdp.zig | 39 |
2 files changed, 31 insertions, 20 deletions
diff --git a/src/Client.zig b/src/Client.zig index cbe4d17..0c8bb8f 100644 --- a/src/Client.zig +++ b/src/Client.zig @@ -46,11 +46,11 @@ pub fn sendRelay(self: *Client, io: Io, payload: []const u8, dest: [4]u8) !void const rand = io_source.interface(); var headers: EthIpUdp = .{ - .src_mac = .fromSlice(self.socket.mac), + .src_mac = .fromBytes(self.socket.mac), .ip = .{ .id = rand.int(u16), - .src_addr = 0, //rand.int(u32), - .dst_addr = @bitCast([_]u8{ 255, 255, 255, 255 }), + .src_addr = .fromBytes(.{ 0, 0, 0, 0 }), //rand.int(u32), + .dst_addr = .fromBytes(.{ 255, 255, 255, 255 }), .len = undefined, }, .udp = .{ @@ -86,11 +86,11 @@ pub fn connect(self: Client, io: Io, payload: []const u8) (error{ BpfAttachFaile const rand = io_source.interface(); var headers: EthIpUdp = .{ - .src_mac = .fromSlice(self.socket.mac), + .src_mac = .fromBytes(self.socket.mac), .ip = .{ .id = rand.int(u16), - .src_addr = 0, //rand.int(u32), - .dst_addr = @bitCast([_]u8{ 255, 255, 255, 255 }), + .src_addr = .fromBytes(.{ 0, 0, 0, 0 }), //rand.int(u32), + .dst_addr = .fromBytes(.{ 255, 255, 255, 255 }), .len = undefined, }, .udp = .{ diff --git a/src/EthIpUdp.zig b/src/EthIpUdp.zig index b286db2..a65a96f 100644 --- a/src/EthIpUdp.zig +++ b/src/EthIpUdp.zig @@ -14,6 +14,28 @@ // You should have received a copy of the GNU General Public License along with // Zaprus. If not, see <https://www.gnu.org/licenses/>. +pub const IpAddr = packed struct { + int: I, + + const V = @Vector(4, u8); + const I = u32; + + pub fn fromBytes(s: V) IpAddr { + return .{ .int = @bitCast(s) }; + } +}; + +pub const MacAddr = packed struct { + int: I, + + const V = @Vector(6, u8); + const I = @Int(.unsigned, @bitSizeOf(V)); + + pub fn fromBytes(s: V) MacAddr { + return .{ .int = @bitCast(s) }; + } +}; + pub const EthIpUdp = packed struct(u336) { // 42 bytes * 8 bits = 336 // --- UDP (Last in memory, defined first for LSB->MSB) --- udp: packed struct { @@ -25,8 +47,8 @@ pub const EthIpUdp = packed struct(u336) { // 42 bytes * 8 bits = 336 // --- IP --- ip: packed struct { - dst_addr: u32, - src_addr: u32, + dst_addr: IpAddr, + src_addr: IpAddr, header_checksum: u16 = 0, protocol: u8 = 17, // udp ttl: u8 = 0x40, @@ -54,18 +76,7 @@ pub const EthIpUdp = packed struct(u336) { // 42 bytes * 8 bits = 336 // --- Ethernet --- eth_type: u16 = std.os.linux.ETH.P.IP, src_mac: MacAddr, - dst_mac: MacAddr = .fromSlice(@splat(0xff)), - - pub const MacAddr = packed struct { - int: I, - - pub const V = @Vector(6, u8); - pub const I = @Int(.unsigned, @bitSizeOf(V)); - - pub fn fromSlice(s: V) MacAddr { - return .{ .int = @bitCast(s) }; - } - }; + dst_mac: MacAddr = .fromBytes(@splat(0xff)), pub fn toBytes(self: @This()) [336 / 8]u8 { var res: [336 / 8]u8 = undefined; |
