5 Commits

Author SHA1 Message Date
4b09e13079 Release 0.2.2 2026-04-15 21:58:25 -04:00
91fdb2c6f8 refactor: use packed struct for IpAddr
This is more intuitive than using u32 directly, and follows the same pattern as the new MAC addr handling
2026-04-16 04:56:23 +03:00
7077aae9ce fix: convert MacAddr from vector to int
Still expose a vector / slice API with .fromSlice,
2026-04-16 04:56:23 +03:00
cbbd710b9d Release 0.2.1 2026-02-04 20:39:59 -05:00
d1ca448835 Release v0.2.0 2026-02-01 21:02:39 -05:00
3 changed files with 33 additions and 11 deletions

View File

@@ -10,7 +10,7 @@
// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.0",
.version = "0.2.2",
// Together with name, this represents a globally unique package
// identifier. This field is generated by the Zig toolchain when the

View File

@@ -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 = 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 = 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 = .{

View File

@@ -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,
@@ -53,8 +75,8 @@ pub const EthIpUdp = packed struct(u336) { // 42 bytes * 8 bits = 336
// --- Ethernet ---
eth_type: u16 = std.os.linux.ETH.P.IP,
src_mac: @Vector(6, u8),
dst_mac: @Vector(6, u8) = @splat(0xff),
src_mac: MacAddr,
dst_mac: MacAddr = .fromBytes(@splat(0xff)),
pub fn toBytes(self: @This()) [336 / 8]u8 {
var res: [336 / 8]u8 = undefined;