| /* |
| * Copyright 2017-present Open Networking Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.onosproject.dhcprelay.store; |
| |
| import com.google.common.base.MoreObjects; |
| import com.google.common.collect.Sets; |
| import org.onlab.packet.DHCP; |
| import org.onlab.packet.DHCP6; |
| import org.onlab.packet.Ip4Address; |
| import org.onlab.packet.Ip6Address; |
| import org.onlab.packet.MacAddress; |
| import org.onlab.packet.VlanId; |
| import org.onosproject.net.HostId; |
| import org.onosproject.net.HostLocation; |
| |
| import java.util.Objects; |
| import java.util.Optional; |
| import java.util.Set; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| /** |
| * A class to record DHCP from DHCP relay application. |
| */ |
| public class DhcpRecord { |
| private final Set<HostLocation> locations; |
| private final MacAddress macAddress; |
| private final VlanId vlanId; |
| private MacAddress nextHop; |
| |
| private Ip4Address ip4Address; |
| private DHCP.MsgType ip4Status; |
| |
| private Ip6Address ip6Address; |
| private DHCP6.MsgType ip6Status; |
| |
| private long lastSeen; |
| private boolean directlyConnected; |
| |
| /** |
| * Creates a DHCP record for a host (mac + vlan). |
| * |
| * @param hostId the host id for the host |
| */ |
| public DhcpRecord(HostId hostId) { |
| checkNotNull(hostId, "Host id can't be null"); |
| |
| this.locations = Sets.newHashSet(); |
| this.macAddress = hostId.mac(); |
| this.vlanId = hostId.vlanId(); |
| this.lastSeen = System.currentTimeMillis(); |
| this.directlyConnected = false; |
| } |
| |
| /** |
| * Gets host locations. |
| * |
| * @return the locations of host |
| */ |
| public Set<HostLocation> locations() { |
| return locations; |
| } |
| |
| /** |
| * Adds a location to record. |
| * |
| * @param location the location |
| * @return the DHCP record |
| */ |
| public DhcpRecord addLocation(HostLocation location) { |
| locations.add(location); |
| return this; |
| } |
| |
| /** |
| * Removes a location from record. |
| * |
| * @param location the location |
| * @return the DHCP record |
| */ |
| public DhcpRecord removeLocation(HostLocation location) { |
| locations.remove(location); |
| return this; |
| } |
| |
| /** |
| * Gets host mac address of this record. |
| * |
| * @return the host mac address |
| */ |
| public MacAddress macAddress() { |
| return macAddress; |
| } |
| |
| /** |
| * Gets host vlan id of this record. |
| * |
| * @return the host id. |
| */ |
| public VlanId vlanId() { |
| return vlanId; |
| } |
| |
| /** |
| * Gets IPv4 address which assigned to the host. |
| * |
| * @return the IP address assigned to the host |
| */ |
| public Optional<Ip4Address> ip4Address() { |
| return Optional.ofNullable(ip4Address); |
| } |
| |
| /** |
| * Sets IPv4 address. |
| * |
| * @param ip4Address the IPv4 address |
| * @return the DHCP record |
| */ |
| public DhcpRecord ip4Address(Ip4Address ip4Address) { |
| this.ip4Address = ip4Address; |
| return this; |
| } |
| |
| /** |
| * Gets IPv6 address which assigned to the host. |
| * |
| * @return the IP address assigned to the host |
| */ |
| public Optional<Ip6Address> ip6Address() { |
| return Optional.ofNullable(ip6Address); |
| } |
| |
| /** |
| * Sets IPv6 address. |
| * |
| * @param ip6Address the IPv6 address |
| * @return the DHCP record |
| */ |
| public DhcpRecord ip6Address(Ip6Address ip6Address) { |
| this.ip6Address = ip6Address; |
| return this; |
| } |
| |
| /** |
| * Gets the latest time this record updated. |
| * |
| * @return the last time host send or receive DHCP packet |
| */ |
| public long lastSeen() { |
| return lastSeen; |
| } |
| |
| /** |
| * Updates the update time of this record. |
| * |
| * @return the DHCP record |
| */ |
| public DhcpRecord updateLastSeen() { |
| lastSeen = System.currentTimeMillis(); |
| return this; |
| } |
| |
| /** |
| * Indicated that the host is direct connected to the network or not. |
| * |
| * @return true if the host is directly connected to the network; false otherwise |
| */ |
| public boolean directlyConnected() { |
| return directlyConnected; |
| } |
| |
| /** |
| * Sets the flag which indicated that the host is directly connected to the |
| * network. |
| * |
| * @param directlyConnected the flag to set |
| * @return the DHCP record |
| */ |
| public DhcpRecord setDirectlyConnected(boolean directlyConnected) { |
| this.directlyConnected = directlyConnected; |
| return this; |
| } |
| |
| /** |
| * Gets the DHCPv4 status of this record. |
| * |
| * @return the DHCPv4 status; empty if not exists |
| */ |
| public Optional<DHCP.MsgType> ip4Status() { |
| return Optional.ofNullable(ip4Status); |
| } |
| |
| /** |
| * Sets status of DHCPv4. |
| * |
| * @param ip4Status the status |
| * @return the DHCP record |
| */ |
| public DhcpRecord ip4Status(DHCP.MsgType ip4Status) { |
| this.ip4Status = ip4Status; |
| return this; |
| } |
| |
| /** |
| * Gets the DHCPv6 status of this record. |
| * |
| * @return the DHCPv6 status; empty if not exists |
| */ |
| public Optional<DHCP6.MsgType> ip6Status() { |
| return Optional.ofNullable(ip6Status); |
| } |
| |
| /** |
| * Sets status of DHCPv6. |
| * |
| * @param ip6Status the DHCPv6 status |
| * @return the DHCP record |
| */ |
| public DhcpRecord ip6Status(DHCP6.MsgType ip6Status) { |
| this.ip6Status = ip6Status; |
| return this; |
| } |
| |
| /** |
| * Gets nextHop mac address. |
| * |
| * @return the IPv4 nextHop mac address; empty if not exists |
| */ |
| public Optional<MacAddress> nextHop() { |
| return Optional.ofNullable(nextHop); |
| } |
| |
| /** |
| * Sets nextHop mac address. |
| * |
| * @param nextHop the IPv4 nextHop mac address |
| * @return the DHCP record |
| */ |
| public DhcpRecord nextHop(MacAddress nextHop) { |
| this.nextHop = nextHop; |
| return this; |
| } |
| |
| /** |
| * Clone this DHCP record. |
| * |
| * @return the DHCP record which cloned |
| */ |
| public DhcpRecord clone() { |
| DhcpRecord newRecord = new DhcpRecord(HostId.hostId(macAddress, vlanId)); |
| locations.forEach(newRecord::addLocation); |
| newRecord.directlyConnected = directlyConnected; |
| newRecord.nextHop = nextHop; |
| newRecord.ip4Address = ip4Address; |
| newRecord.ip4Status = ip4Status; |
| newRecord.ip6Address = ip6Address; |
| newRecord.ip6Status = ip6Status; |
| newRecord.lastSeen = lastSeen; |
| return newRecord; |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hash(locations, macAddress, vlanId, ip4Address, ip4Status, |
| nextHop, ip6Address, ip6Status, lastSeen); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (!(obj instanceof DhcpRecord)) { |
| return false; |
| } |
| DhcpRecord that = (DhcpRecord) obj; |
| return Objects.equals(locations, that.locations) && |
| Objects.equals(macAddress, that.macAddress) && |
| Objects.equals(vlanId, that.vlanId) && |
| Objects.equals(ip4Address, that.ip4Address) && |
| Objects.equals(ip4Status, that.ip4Status) && |
| Objects.equals(nextHop, that.nextHop) && |
| Objects.equals(ip6Address, that.ip6Address) && |
| Objects.equals(ip6Status, that.ip6Status) && |
| Objects.equals(lastSeen, that.lastSeen) && |
| Objects.equals(directlyConnected, that.directlyConnected); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("locations", locations) |
| .add("macAddress", macAddress) |
| .add("vlanId", vlanId) |
| .add("ip4Address", ip4Address) |
| .add("ip4State", ip4Status) |
| .add("nextHop", nextHop) |
| .add("ip6Address", ip6Address) |
| .add("ip6State", ip6Status) |
| .add("lastSeen", lastSeen) |
| .add("directlyConnected", directlyConnected) |
| .toString(); |
| } |
| } |