package net.floodlightcontroller.dhcpserver; import java.util.ArrayList; import java.util.Arrays; import net.floodlightcontroller.packet.IPv4; import net.floodlightcontroller.packet.Ethernet; import net.floodlightcontroller.util.MACAddress; import java.lang.String; /** * The class representing a DHCP Binding -- MAC and IP. * It also contains important information regarding the lease status * --active * --inactive * the lease type of the binding * --dynamic * --fixed/static * and the lease times * --start time in seconds * --duration in seconds * * @author Ryan Izard (rizard@g.clemson.edu) */ public class DHCPBinding { public static final int IP_ADDRESS_LENGTH = 4; public static final int IP_ADDRESS_STRING_LENGTH_MAX = 15; public static final int IP_ADDRESS_STRING_LENGTH_MIN = 7; public static final int MAC_ADDRESS_LENGTH = (int) Ethernet.DATALAYER_ADDRESS_LENGTH; public static final int MAC_ADDRESS_STRING_LENGTH = 17; private ArrayList<byte[]> MACS; private byte[] CURRENT_MAC; private byte[] IP = new byte[IP_ADDRESS_LENGTH]; private boolean LEASE_STATUS; private boolean PERMANENT_LEASE; private ArrayList<String> FLOWS; private String HOME_SWITCH; private long LEASE_START_TIME_SECONDS; private long LEASE_DURATION_SECONDS; protected DHCPBinding(byte[] ip, ArrayList<byte[]> macs) { this.MACS = new ArrayList<byte[]>(); for (int i = 0; i < macs.size(); i++) { this.MACS.add(Arrays.copyOf(macs.get(i), MAC_ADDRESS_LENGTH)); } this.CURRENT_MAC = null; this.setIPv4Addresss(ip); this.setLeaseStatus(false); FLOWS = new ArrayList<String>(); this.FLOWS.add(""); this.HOME_SWITCH = ""; } protected DHCPBinding(byte[] ip, byte[] mac) { this.MACS = new ArrayList<byte[]>(); this.MACS.add(Arrays.copyOf(mac, MAC_ADDRESS_LENGTH)); this.CURRENT_MAC = Arrays.copyOf(mac, MAC_ADDRESS_LENGTH); this.setIPv4Addresss(ip); this.setLeaseStatus(false); FLOWS = new ArrayList<String>(); this.FLOWS.add(""); this.HOME_SWITCH = ""; } public String getHomeSwitch() { return HOME_SWITCH; } public void setHomeSwitch(String dpid) { HOME_SWITCH = dpid; } public String getFlowName() { if (FLOWS.size() == 0) { return null; } else { return FLOWS.get(0); } } public void setFlowName(String flowName) { FLOWS.clear(); FLOWS.add(flowName); } public byte[] getIPv4AddressBytes() { return IP; } public String getIPv4AddresString() { return IPv4.fromIPv4Address(IPv4.toIPv4Address(IP)); } public byte[] getMACAddressBytes(int index) { return MACS.get(index); } public byte[] getCurrentMACAddressBytes() { return CURRENT_MAC; } public void setCurrentMACAddressBytes(byte[] mac) { CURRENT_MAC = Arrays.copyOf(mac, MAC_ADDRESS_LENGTH); } public String getCurrentMACAddressString() { return MACAddress.valueOf(CURRENT_MAC).toString(); } public String getMACAddressString(int index) { return MACAddress.valueOf(MACS.get(index)).toString(); } public ArrayList<byte[]> getMACAddresses() { return MACS; } public String getMACAddressesString() { String macString = ""; for (byte[] mac : MACS) { if (macString.isEmpty()) { macString = MACAddress.valueOf(mac).toString(); } else { macString = macString + ", " + MACAddress.valueOf(mac).toString(); } } return macString; } public boolean isMACMemberOf(byte[] mac) { for (byte[] test : MACS) { if (Arrays.equals(test, mac)) { return true; } } return false; } public int getNumberOfMACAddresses() { return MACS.size(); } private void setIPv4Addresss(byte[] ip) { IP = Arrays.copyOf(ip, IP_ADDRESS_LENGTH); } public void addMACAddress(byte[] mac) { if (!MACS.contains(mac)) { MACS.add(Arrays.copyOf(mac, MAC_ADDRESS_LENGTH)); } CURRENT_MAC = Arrays.copyOf(mac, MAC_ADDRESS_LENGTH); } public void addMACAddress(String mac) { if (!MACS.contains(Ethernet.toMACAddress(mac))) { MACS.add(Ethernet.toMACAddress(mac)); } CURRENT_MAC = Ethernet.toMACAddress(mac); } public void addMACAddresses(ArrayList<byte[]> macs) { for (byte[] mac : macs) { MACS.add(Arrays.copyOf(mac, MAC_ADDRESS_LENGTH)); } } public void setMACAddresses(ArrayList<byte[]> macs) { clearMACAddresses(); addMACAddresses(macs); } public void clearMACAddresses() { MACS.clear(); CURRENT_MAC = null; } public boolean isActiveLease() { return LEASE_STATUS; } public void setStaticIPLease(boolean staticIP) { PERMANENT_LEASE = staticIP; } public boolean isStaticIPLease() { return PERMANENT_LEASE; } public void setLeaseStatus(boolean status) { LEASE_STATUS = status; } public boolean isLeaseExpired() { long currentTime = System.currentTimeMillis(); if ((currentTime / 1000) >= (LEASE_START_TIME_SECONDS + LEASE_DURATION_SECONDS)) { return true; } else { return false; } } protected void setLeaseStartTimeSeconds() { LEASE_START_TIME_SECONDS = System.currentTimeMillis() / 1000; } protected void setLeaseDurationSeconds(long time) { LEASE_DURATION_SECONDS = time; } protected void clearLeaseTimes() { LEASE_START_TIME_SECONDS = 0; LEASE_DURATION_SECONDS = 0; } protected boolean cancelLease() { this.clearLeaseTimes(); this.setLeaseStatus(false); return true; } }