org.opendaylight.dhcp.server.ExampleLeaseManager.java Source code

Java tutorial

Introduction

Here is the source code for org.opendaylight.dhcp.server.ExampleLeaseManager.java

Source

/*
 * Copyright (c) 2015 Cisco Systems and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */

package org.opendaylight.dhcp.server;

import com.google.common.io.BaseEncoding;
import com.google.common.net.InetAddresses;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.anarres.dhcp.common.address.NetworkAddress;
import org.anarres.dhcp.common.address.Subnet;
import org.apache.directory.server.dhcp.DhcpException;
import org.apache.directory.server.dhcp.io.DhcpRequestContext;
import org.apache.directory.server.dhcp.messages.DhcpMessage;
import org.apache.directory.server.dhcp.messages.HardwareAddress;
import org.apache.directory.server.dhcp.options.OptionsField;
import org.apache.directory.server.dhcp.options.dhcp.VendorClassIdentifier;
import org.apache.directory.server.dhcp.options.misc.VendorSpecificInformation;
import org.apache.directory.server.dhcp.service.manager.AbstractDynamicLeaseManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Example implementation of a lease manager. It provides IPs to the clients based on an initial IP increasing the IP by one for every new client. <p/>
 * <b> This is NOT intended for real use. </b>
 */
public class ExampleLeaseManager extends AbstractDynamicLeaseManager implements AutoCloseable {

    private static final Logger LOG = LoggerFactory.getLogger(ExampleLeaseManager.class);

    private InetAddress ip;

    public ExampleLeaseManager(final String ip) {
        try {
            this.ip = Inet4Address.getByName(ip);
        } catch (UnknownHostException e) {
            throw new IllegalArgumentException("Invalid base IP provided", e);
        }
    }

    @Override
    protected InetAddress getFixedAddressFor(final HardwareAddress hardwareAddress) throws DhcpException {
        LOG.info("ExampleLeaseManager.getFixedAddressFor {}", hardwareAddress);
        return null;
    }

    @Override
    protected Subnet getSubnetFor(final NetworkAddress networkAddress) throws DhcpException {
        LOG.info("ExampleLeaseManager.getSubnetFor {}", networkAddress);
        return null;
    }

    @Override
    protected boolean leaseIp(final InetAddress address, final HardwareAddress hardwareAddress, final long ttl)
            throws Exception {
        LOG.info("ExampleLeaseManager.leaseIp {}, {}", address, hardwareAddress);
        return true;
    }

    @Override
    protected InetAddress leaseMac(final DhcpRequestContext context, final DhcpMessage request,
            final InetAddress clientRequestedAddress, final long ttl) throws Exception {
        this.ip = InetAddresses.increment(ip);
        LOG.info("ExampleLeaseManager.leaseMac leasing: {}", ip);
        return ip;
    }

    @Override
    public DhcpMessage leaseOffer(final DhcpRequestContext context, final DhcpMessage request,
            final InetAddress clientRequestedAddress, final long clientRequestedExpirySecs) throws DhcpException {
        LOG.info("ExampleLeaseManager.leaseOffer request: {}, requested address: {}", request.getOptions(),
                clientRequestedAddress);
        request.getOptions().getStringOption(VendorClassIdentifier.class);

        final DhcpMessage dhcpMessage = super.leaseOffer(context, request, clientRequestedAddress,
                clientRequestedExpirySecs);

        // Add some option
        final OptionsField options = dhcpMessage.getOptions();
        options.setOption(VendorSpecificInformation.class, BaseEncoding.base16().decode("0B0410000002"));
        dhcpMessage.setOptions(options);
        LOG.info("ExampleLeaseManager.leaseOffer response: {}", dhcpMessage);
        return dhcpMessage;
    }

    @Override
    public void close() throws Exception {
        // No resources to close
    }
}