/*
* Copyright (c) 2013 Big Switch Networks, Inc.
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
*
* 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.sdnplatform.netvirt.core;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.ser.ToStringSerializer;
import org.sdnplatform.devicegroup.DeviceGroupBase;
import org.sdnplatform.devicemanager.IDevice;
/**
* Representation of a Network Virtualization. This will contain configuration
* and state specific to a single NetVirt.
*
* NOTE! This object can not store any state.
*
* @author readams
*/
public class VNS extends DeviceGroupBase {
// ARP & DHCP Managers will have to access these enums
@JsonSerialize(using=ToStringSerializer.class)
public enum DHCPMode {
FLOOD_IF_UNKNOWN("flood-if-unknown"), // discover DHCP server with broadcast
STATIC("static"),
L3_RELAY("relay"),
ALWAYS_FLOOD("always-flood");
private String value;
DHCPMode(String v) {
value = v;
}
@Override
public String toString() {
return value;
}
public static DHCPMode fromString(String str) {
for (DHCPMode m : DHCPMode.values()) {
if (m.value.equals(str)) {
return m;
}
}
return DHCPMode.FLOOD_IF_UNKNOWN;
}
}
@JsonSerialize(using=ToStringSerializer.class)
public enum ARPMode {
DROP_IF_UNKNOWN("drop-if-unknown"), // drop if we don't know about the host
FLOOD_IF_UNKNOWN("flood-if-unknown"), // broadcast if we don't know about the host
ALWAYS_FLOOD("always-flood"); // always broadcast
private String value;
ARPMode(String v) {
value = v;
}
@Override
public String toString() {
return value;
}
public static ARPMode fromString(String str) {
for (ARPMode m : ARPMode.values()) {
if (m.value.equals(str)) {
return m;
}
}
return ARPMode.FLOOD_IF_UNKNOWN;
}
}
@JsonSerialize(using=ToStringSerializer.class)
public enum BroadcastMode {
DROP("drop"),
FORWARD_TO_KNOWN("forward-to-known"), // send to known hosts in NetVirt
ALWAYS_FLOOD("always-flood");
private String value;
BroadcastMode(String v) {
value = v;
}
@Override
public String toString() {
return value;
}
public static BroadcastMode fromString(String str) {
for (BroadcastMode m : BroadcastMode.values()) {
if (m.value.equals(str)) {
return m;
}
}
return BroadcastMode.FORWARD_TO_KNOWN;
}
}
// DHCP Manager related configuration
protected DHCPMode dhcpMode = DHCPMode.FLOOD_IF_UNKNOWN;
protected int dhcpIp; // If 0, we don't know the IP
// ARP Manager related configuration
protected ARPMode arpMode = ARPMode.FLOOD_IF_UNKNOWN;
// Broadcast related configuration
protected BroadcastMode broadcastMode = BroadcastMode.FORWARD_TO_KNOWN;
// Address-Space this NetVirt belongs to.
protected String addressSpaceName;
// Devices known to this NetVirt, used for BroadcastMode.FORWARD_TO_KNOWN
protected Set<Long> knownDevices;
/* Used to garbage collect stale config data */
protected boolean marked;
/* Origin/creator name */
private String origin;
public VNS(String name) {
super(name);
dhcpIp = 0;
knownDevices =
Collections.newSetFromMap(new ConcurrentHashMap<Long,Boolean>());
}
@JsonIgnore
public boolean isMarked() {
return marked;
}
public void setMarked(boolean marked) {
this.marked = marked;
}
public void setDhcpManagerMode(DHCPMode mode) {
this.dhcpMode = mode;
}
public DHCPMode getDhcpManagerMode() {
return dhcpMode;
}
public void setAddressSpaceName(String addressSpaceName) {
if (addressSpaceName == null || addressSpaceName.isEmpty()) {
this.addressSpaceName = "default";
} else {
this.addressSpaceName = addressSpaceName;
}
}
public String getAddressSpaceName() {
if (addressSpaceName == null || addressSpaceName.isEmpty()) {
this.addressSpaceName = "default";
}
return addressSpaceName;
}
public void setDhcpIp(int ip) {
this.dhcpIp = ip;
}
public int getDhcpIp() {
return dhcpIp;
}
public void setArpManagerMode(ARPMode mode) {
this.arpMode = mode;
}
public ARPMode getArpManagerMode() {
return this.arpMode;
}
public void setBroadcastMode(BroadcastMode mode) {
this.broadcastMode = mode;
}
public BroadcastMode getBroadcastMode() {
return this.broadcastMode;
}
@JsonIgnore
public Set<Long> getKnownDevices() {
return knownDevices;
}
public void addDevice(IDevice device) {
knownDevices.add(device.getDeviceKey());
}
public void removeDevice(long deviceKey) {
if (knownDevices.contains(deviceKey))
knownDevices.remove(deviceKey);
}
public void setOrigin(String origin) {
this.origin = origin;
}
public String getOrigin() {
return this.origin;
}
public void removeAllDevices() {
knownDevices.clear();
}
@Override
public String toString() {
return (name +
" [Active " + active + "]" +
" [Priority " + priority + "]");
}
}