code: func (c *conn) serve() {
  	// Attempt to parse a Request from a raw packet, providing a nicer
  	// API for callers to implement their own DHCP request handlers.
  	r, err := ParseRequest(c.buf, c.remoteAddr)
  	if err != nil {
  		// Malformed packets get no response
  		if err == dhcp6.ErrInvalidPacket {
  			return
  		}
  
  		// BUG(mdlayher): decide to log or handle other request errors
  		c.server.logf("%s: error parsing request: %s", c.remoteAddr.String(), err.Error())
  		return
  	}
  
  	// Filter out unknown/invalid message types, using the lowest and highest
  	// numbered types
  	if r.MessageType < dhcp6.MessageTypeSolicit || r.MessageType > dhcp6.MessageTypeDHCPv4Response {
  		c.server.logf("%s: unrecognized message type: %d", c.remoteAddr.String(), r.MessageType)
  		return
  	}
  
  	// Set up response to send responses back to the original requester
  	w := &response{
  		remoteAddr: c.remoteAddr,
  		conn:       c.conn,
  		req:        r,
  		options:    make(dhcp6.Options),
  	}
  
  	// Add server ID to response
  	if sID := c.server.ServerID; sID != nil {
  		_ = w.options.Add(dhcp6.OptionServerID, sID)
  	}
  
  	// If available in request, add client ID to response
  	if cID, err := dhcp6opts.GetClientID(r.Options); err == nil {
  		w.options.Add(dhcp6.OptionClientID, cID)
  	}
  
  	// Enforce a valid Handler.
  	handler := c.server.Handler
  	if handler == nil {
  		panic("nil DHCPv6 handler for server")
  	}
  
  	handler.ServeDHCP(w, r)
  }
docs: // serve handles serving an individual DHCP connection, and is invoked in a
  // goroutine.