2 * Copyright (c) 2015 Dell Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netvirt.ipv6service;
11 import io.netty.util.Timeout;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.ConcurrentHashMap;
16 import java.util.concurrent.ConcurrentMap;
17 import java.util.stream.Collectors;
18 import java.util.stream.Stream;
19 import org.opendaylight.netvirt.ipv6service.api.IVirtualPort;
20 import org.opendaylight.netvirt.ipv6service.utils.Ipv6Constants;
21 import org.opendaylight.netvirt.ipv6service.utils.Ipv6PeriodicTimer;
22 import org.opendaylight.netvirt.ipv6service.utils.Ipv6PeriodicTrQueue;
23 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceUtils;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 // This class needs to be overridden by Mockito
32 @SuppressWarnings("checkstyle:FinalClass")
33 public class VirtualPort implements IVirtualPort {
34 static final Logger LOG = LoggerFactory.getLogger(VirtualPort.class);
36 private final Uuid intfUUID;
37 private final Uuid networkID;
38 private final String macAddress;
39 private final boolean routerIntfFlag;
40 private final String deviceOwner;
41 private final ConcurrentMap<Uuid, SubnetInfo> snetInfo = new ConcurrentHashMap<>();
43 private volatile Long ofPort;
44 private volatile BigInteger dpId;
45 private volatile boolean serviceBindingStatus;
46 private volatile Ipv6PeriodicTimer periodicTimer;
47 private volatile Timeout periodicTimeout;
49 // associated router if any
50 private volatile VirtualRouter router;
52 // TODO:: Need Openflow port
54 private VirtualPort(Builder builder) {
55 this.intfUUID = builder.intfUUID;
56 this.networkID = builder.networkID;
57 this.macAddress = builder.macAddress;
58 this.routerIntfFlag = builder.routerIntfFlag;
59 this.deviceOwner = builder.deviceOwner;
63 public Uuid getIntfUUID() {
68 public Uuid getNetworkID() {
72 public void setSubnetInfo(Uuid snetID, IpAddress fixedIp) {
74 snetInfo.computeIfAbsent(snetID, key -> new SubnetInfo(snetID, fixedIp)).setIpAddr(fixedIp);
78 public void clearSubnetInfo() {
82 public void removeSubnetInfo(Uuid snetID) {
84 this.snetInfo.remove(snetID);
88 public void setSubnet(Uuid snetID, VirtualSubnet subnet) {
89 SubnetInfo subnetInfo = snetID != null ? snetInfo.get(snetID) : null;
90 if (subnetInfo == null) {
91 LOG.info("Subnet {} not associated with the virtual port {}",
95 subnetInfo.setSubnet(subnet);
98 public List<VirtualSubnet> getSubnets() {
99 List<VirtualSubnet> subnetList = new ArrayList<>();
100 for (SubnetInfo subnetInfo : snetInfo.values()) {
101 if (subnetInfo.getSubnet() != null) {
102 subnetList.add(subnetInfo.getSubnet());
109 public List<IpAddress> getIpAddresses() {
110 return snetInfo.values().stream().flatMap(subnetInfo -> Stream.of(subnetInfo.getIpAddr()))
111 .collect(Collectors.toList());
115 public List<Ipv6Address> getIpv6Addresses() {
116 List<Ipv6Address> ipv6AddrList = snetInfo.values().stream().flatMap(
117 subnetInfo -> Stream.of(subnetInfo.getIpAddr().getIpv6Address())).collect(Collectors.toList());
119 if (deviceOwner.equalsIgnoreCase(Ipv6Constants.NETWORK_ROUTER_INTERFACE)) {
120 Ipv6Address llAddr = Ipv6ServiceUtils.getIpv6LinkLocalAddressFromMac(new MacAddress(macAddress));
121 ipv6AddrList.add(llAddr);
126 public List<Ipv6Address> getIpv6AddressesWithoutLLA() {
127 return snetInfo.values().stream().flatMap(
128 subnetInfo -> Stream.of(subnetInfo.getIpAddr().getIpv6Address())).collect(Collectors.toList());
132 public String getMacAddress() {
136 public boolean getRouterIntfFlag() {
137 return routerIntfFlag;
140 public void setRouter(VirtualRouter rtr) {
144 public VirtualRouter getRouter() {
149 public String getDeviceOwner() {
153 public void setDpId(BigInteger dpId) {
158 public BigInteger getDpId() {
162 public void setOfPort(Long ofPort) {
163 this.ofPort = ofPort;
166 public Long getOfPort() {
170 public void setServiceBindingStatus(Boolean status) {
171 this.serviceBindingStatus = status;
174 public boolean getServiceBindingStatus() {
175 return serviceBindingStatus;
178 public void removeSelf() {
179 if (routerIntfFlag) {
180 if (router != null) {
181 router.removeInterface(this);
185 for (SubnetInfo subnetInfo: snetInfo.values()) {
186 if (subnetInfo.getSubnet() != null) {
187 subnetInfo.getSubnet().removeInterface(this);
193 public String toString() {
194 return "VirtualPort[IntfUUid=" + intfUUID + " subnetInfo="
195 + snetInfo + " NetworkId=" + networkID + " mac=" + macAddress + " ofPort="
196 + ofPort + " routerFlag=" + routerIntfFlag + " dpId=" + dpId + "]";
199 public void setPeriodicTimer(Ipv6PeriodicTrQueue ipv6Queue) {
200 periodicTimer = new Ipv6PeriodicTimer(intfUUID, ipv6Queue);
203 public Ipv6PeriodicTimer getPeriodicTimer() {
204 return periodicTimer;
207 public void setPeriodicTimeout(Timeout timeout) {
208 periodicTimeout = timeout;
211 public void resetPeriodicTimeout() {
212 periodicTimeout = null;
215 public Timeout getPeriodicTimeout() {
216 return periodicTimeout;
219 private static class SubnetInfo {
220 private final Uuid subnetID;
221 private volatile IpAddress ipAddr;
223 private volatile VirtualSubnet subnet;
225 SubnetInfo(Uuid subnetId, IpAddress ipAddr) {
226 this.subnetID = subnetId;
227 this.ipAddr = ipAddr;
230 public Uuid getSubnetID() {
234 public IpAddress getIpAddr() {
238 public void setIpAddr(IpAddress ipAddr) {
239 this.ipAddr = ipAddr;
242 public VirtualSubnet getSubnet() {
246 public void setSubnet(VirtualSubnet subnet) {
247 this.subnet = subnet;
251 public String toString() {
252 return "subnetInfot[subnetId=" + subnetID + " ipAddr=" + ipAddr + " ]";
256 public static Builder builder() {
257 return new Builder();
260 public static class Builder {
261 private Uuid intfUUID;
262 private Uuid networkID;
263 private String macAddress;
264 private boolean routerIntfFlag;
265 private String deviceOwner;
267 public Builder intfUUID(Uuid newIntfUUID) {
268 this.intfUUID = newIntfUUID;
272 public Builder networkID(Uuid newNetworkID) {
273 this.networkID = newNetworkID;
277 public Builder macAddress(String newMacAddress) {
278 this.macAddress = newMacAddress;
282 public Builder routerIntfFlag(boolean value) {
283 this.routerIntfFlag = value;
287 public Builder deviceOwner(String newDeviceOwner) {
288 this.deviceOwner = newDeviceOwner;
292 public VirtualPort build() {
293 return new VirtualPort(this);