Skip to content

cloudboss/dhcpz

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dhcpz

A DHCP protocol library for Zig.

Installation

zig fetch --save git+https://github.com/cloudboss/dhcpz

Then in your build.zig:

const dhcpz = b.dependency("dhcpz", .{
    .target = target,
});
exe.root_module.addImport("dhcpz", dhcpz.module("dhcpz"));

Example

const std = @import("std");
const v4 = @import("dhcpz").v4;

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    // Create DHCPDISCOVER
    const mac = [6]u8{ 0x02, 0x00, 0x00, 0x00, 0x00, 0x01 };
    var discover = try v4.createDiscover(allocator, 0x12345678, mac);
    defer discover.deinit();

    // Encode to bytes
    var buf: [1500]u8 = undefined;
    const len = try discover.encode(&buf);

    // Send buf[0..len] over UDP to port 67...

    // Decode response
    var response = try v4.Message.decode(allocator, received_data);
    defer response.deinit();

    // Check message type
    if (response.options.getMessageType()) |msg_type| {
        if (msg_type == .offer) {
            // Handle DHCPOFFER
            const offered_ip = response.yiaddr;
            const subnet = response.options.get(.subnet_mask);
            const gateway = response.options.get(.router);
            // ...
        }
    }
}

API

All DHCPv4 types are under dhcpz.v4.

Types

  • v4.Message - DHCP message with header fields and options
  • v4.Option - Tagged union of all supported option types
  • v4.MessageType - DISCOVER, OFFER, REQUEST, ACK, NAK, etc.
  • v4.OptionCode - Option type codes
  • v4.Ipv4Addr - [4]u8 alias for IPv4 addresses

Functions

  • v4.createDiscover(allocator, xid, mac) - Create DHCPDISCOVER message
  • v4.createRequest(allocator, xid, mac, requested_ip, server_id) - Create DHCPREQUEST message

Message Methods

  • Message.init(allocator) - Create empty message
  • Message.deinit() - Free all allocated memory
  • Message.encode(buf) - Encode to bytes, returns length
  • Message.decode(allocator, data) - Decode from bytes
  • Message.setXid(xid) - Set transaction ID
  • Message.setChaddr(mac) - Set client hardware address
  • Message.setBroadcast(bool) - Set broadcast flag

Options Methods

  • Options.append(option) - Add an option (takes ownership of slice data)
  • Options.get(tag) - Get option by tag, returns payload or null
  • Options.getMessageType() - Convenience for getting message type

Building

zig build test

License

MIT

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages