Documentation ¶
Overview ¶
Package server6 is a basic, extensible DHCPv6 server.
To use the DHCPv6 server code you have to call NewServer with three arguments:
- an interface to listen on,
- an address to listen on, and
- a handler function, that will be called every time a valid DHCPv6 packet is received.
The address to listen on is used to know IP address, port and optionally the scope to create and UDP socket to listen on for DHCPv6 traffic.
The handler is a function that takes as input a packet connection, that can be used to reply to the client; a peer address, that identifies the client sending the request, and the DHCPv6 packet itself. Just implement your custom logic in the handler.
Optionally, NewServer can receive options that will modify the server object. Some options already exist, for example WithConn. If this option is passed with a valid connection, the listening address argument is ignored.
Example program:
package main import ( "log" "net" "github.com/qbornet/dhcp/dhcpv6" "github.com/qbornet/dhcp/dhcpv6/server6" ) func handler(conn net.PacketConn, peer net.Addr, m dhcpv6.DHCPv6) { // this function will just print the received DHCPv6 message, without replying log.Print(m.Summary()) } func main() { laddr := net.UDPAddr{ IP: net.ParseIP("::1"), Port: 547, } server, err := server6.NewServer("eth0", &laddr, handler) if err != nil { log.Fatal(err) } // This never returns. If you want to do other stuff, dump it into a // goroutine. server.Serve() }
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewIPv6UDPConn ¶
NewIPv6UDPConn returns a UDPv6-only connection bound to both the interface and port given based on a IPv6 DGRAM socket. As a bonus, you can actually listen on a multicast address instead of being punted to the wildcard
The interface must already be configured.
Types ¶
type DebugLogger ¶
type DebugLogger struct { // Printfer is used for actual output of the logger Printfer }
DebugLogger is a wrapper for Printfer to implement interface Logger. DHCP messages are printed in the long format.
func (DebugLogger) PrintMessage ¶
func (d DebugLogger) PrintMessage(prefix string, message *dhcpv6.Message)
PrintMessage prints a DHCP message in the long format via predefined Printfer
func (DebugLogger) Printf ¶
func (d DebugLogger) Printf(format string, v ...interface{})
Printf prints a log message as-is via predefined Printfer
type EmptyLogger ¶
type EmptyLogger struct{}
EmptyLogger prints nothing
func (EmptyLogger) PrintMessage ¶
func (e EmptyLogger) PrintMessage(prefix string, message *dhcpv6.Message)
PrintMessage is just a dummy function that does nothing
func (EmptyLogger) Printf ¶
func (e EmptyLogger) Printf(format string, v ...interface{})
Printf is just a dummy function that does nothing
type Handler ¶
Handler is a type that defines the handler function to be called every time a valid DHCPv6 message is received
type Logger ¶
type Logger interface { // PrintMessage print _all_ DHCP messages PrintMessage(prefix string, message *dhcpv6.Message) // Printf is use to print the rest debugging information Printf(format string, v ...interface{}) }
Logger is a handler which will be used to output logging messages
type Printfer ¶
type Printfer interface { // Printf is the function for logging output. Arguments are handled in the manner of fmt.Printf. Printf(format string, v ...interface{}) }
Printfer is used for actual output of the logger. For example *log.Logger is a Printfer.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server represents a DHCPv6 server object
func NewServer ¶
func NewServer(ifname string, addr *net.UDPAddr, handler Handler, opt ...ServerOpt) (*Server, error)
NewServer initializes and returns a new Server object, listening on `addr`.
- If `addr` is a multicast group, the group will be additionally joined
- If `addr` is the wildcard address on the DHCPv6 server port (`[::]:547), the multicast groups All_DHCP_Relay_Agents_and_Servers(`[ff02::1:2]`) and All_DHCP_Servers(`[ff05::1:3]:547`) will be joined.
- If `addr` is nil, IPv6 unspec on the DHCP server port is used and the above behaviour applies
If `WithConn` is used with a non-nil address, `addr` and `ifname` have no effect. In such case, joining the multicast group is the caller's responsibility.
type ServerOpt ¶
type ServerOpt func(s *Server)
A ServerOpt configures a Server.
func WithConn ¶
func WithConn(conn net.PacketConn) ServerOpt
WithConn configures a server with the given connection.
func WithDebugLogger ¶
func WithDebugLogger() ServerOpt
WithDebugLogger logs multi-line full DHCPv6 messages when sent & received.
func WithLogger ¶
WithLogger set the logger (see interface Logger).
func WithSummaryLogger ¶
func WithSummaryLogger() ServerOpt
WithSummaryLogger logs one-line DHCPv6 message summaries when sent & received.
type ShortSummaryLogger ¶
type ShortSummaryLogger struct { // Printfer is used for actual output of the logger Printfer }
ShortSummaryLogger is a wrapper for Printfer to implement interface Logger. DHCP messages are printed in the short format.
func (ShortSummaryLogger) PrintMessage ¶
func (s ShortSummaryLogger) PrintMessage(prefix string, message *dhcpv6.Message)
PrintMessage prints a DHCP message in the short format via predefined Printfer
func (ShortSummaryLogger) Printf ¶
func (s ShortSummaryLogger) Printf(format string, v ...interface{})
Printf prints a log message as-is via predefined Printfer