diff options
author | insomniac <insomniacslk@users.noreply.github.com> | 2018-11-08 14:23:17 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-08 14:23:17 +0000 |
commit | 5221b9b5b5c25d3cb7f947a08375236964d60bbe (patch) | |
tree | 711b94fb08f6f50d980c0cc0cafdba7ed2156dd3 | |
parent | 4da458ed1d2abe3eaa398b551d91ac79c03682f9 (diff) | |
parent | 155ae4e2e35a09c8f33a0a77b04e52b92dabccce (diff) |
Added DHCPv6 client example (#191)
-rw-r--r-- | README.md | 97 |
1 files changed, 95 insertions, 2 deletions
@@ -2,9 +2,102 @@ DHCPv4 and DHCPv6 decoding/encoding library with client and server code, written in Go. -See examples at https://github.com/insomniacslk/exdhcp +# How to get the library -## Public projects that use it +The library is split into several parts: +* `dhcpv6`: implementation of DHCPv6 packet, client and server +* `dhcpv4`: implementation of DHCPv4 packet, client and server +* `netboot`: network booting wrappers on top of `dhcpv6` and `dhcpv4` +* `iana`: several IANA constants, and helpers used by `dhcpv6` and `dhcpv4` +* `rfc1035label`: simple implementation of RFC1035 labels, used by `dhcpv6` and + `dhcpv4` + +You will probably only need `dhcpv6` and/or `dhcpv4` explicitly. The rest is +pulled in automatically if necessary. + + +So, to get `dhcpv6` and `dhpv4` just run: +``` +go get -u github.com/insomniacslk/dhcp/dhcpv{4,6} +``` + + +# Examples + +The sections below will illustrate how to use the `dhcpv6` and `dhcpv4` +packages. + +See more example code at https://github.com/insomniacslk/exdhcp + + +## DHCPv6 client + +To run a DHCPv6 transaction on the interface "eth0": + +``` +package main + +import ( + "log" + + "github.com/insomniacslk/dhcp/dhcpv6" +) + + +func main() { + // NewClient sets up a new DHCPv6 client with default values + // for read and write timeouts, for destination address and listening + // address + client := dhcpv6.NewClient() + + // Exchange runs a Solicit-Advertise-Request-Reply transaction on the + // specified network interface, and returns a list of DHCPv6 packets + // (a "conversation") and an error if any. Notice that Exchange may + // return a non-empty packet list even if there is an error. This is + // intended, because the transaction may fail at any point, and we + // still want to know what packets were exchanged until then. + // The `nil` argument indicates that we want to use a default Solicit + // packet, instead of specifying a custom one ourselves. + conversation, err := client.Exchange("eth0", nil) + + // Summary() prints a verbose representation of the exchanged packets. + for _, packet := range conversation { + log.Print(packet.Summary()) + } + // error handling is done *after* printing, so we still print the + // exchanged packets if any, as explained above. + if err != nil { + log.Fatal(err) + } +} +``` + + +## DHCPv6 packet parsing + +TODO + + +## DHCPv6 server + +TODO + +## DHCPv4 client + +TODO + + +## DHCPv4 packet parsing + +TODO + + +## DHCPv4 server + +TODO + + +# Public projects that use it * Facebook's DHCP load balancer, `dhcplb`, https://github.com/facebookincubator/dhcplb * Systemboot, a LinuxBoot distribution that runs as system firmware, https://github.com/systemboot/systemboot |