5ab75328638971da67393dd5630e48269c9e4e7a
[netvirt.git] / ipv6service / impl / src / main / java / org / opendaylight / netvirt / ipv6service / VirtualNetwork.java
1 /*
2  * Copyright (c) 2016 Red Hat, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netvirt.ipv6service;
9
10 import java.util.Collection;
11 import java.util.List;
12 import java.util.Set;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.concurrent.ConcurrentMap;
15 import java.util.stream.Collectors;
16 import java.util.stream.Stream;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.genius.ipv6util.api.Ipv6Util;
19 import org.opendaylight.netvirt.ipv6service.api.IVirtualNetwork;
20 import org.opendaylight.netvirt.ipv6service.utils.Ipv6ServiceConstants;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
23 import org.opendaylight.yangtools.yang.common.Uint64;
24
25 public class VirtualNetwork implements IVirtualNetwork {
26     private final Uuid networkUUID;
27     private final ConcurrentMap<Uint64, DpnInterfaceInfo> dpnIfaceList = new ConcurrentHashMap<>();
28     private volatile Long elanTag;
29     private volatile int mtu = 0;
30
31     public VirtualNetwork(Uuid networkUUID) {
32         this.networkUUID = networkUUID;
33     }
34
35     @Override
36     public Uuid getNetworkUuid() {
37         return networkUUID;
38     }
39
40     public void updateDpnPortInfo(Uint64 dpnId, Long ofPort,Uuid portId, int addOrRemove) {
41         if (dpnId == null) {
42             return;
43         }
44         synchronized (networkUUID.getValue()) {
45             DpnInterfaceInfo dpnInterface = dpnIfaceList.computeIfAbsent(dpnId, key -> new DpnInterfaceInfo(dpnId));
46             if (addOrRemove == Ipv6ServiceConstants.ADD_ENTRY) {
47                 dpnInterface.updateofPortMap(ofPort, portId);
48             } else {
49                 dpnInterface.removeOfPortFromMap(ofPort);
50             }
51         }
52     }
53
54     @Override
55     public Long getElanTag() {
56         return elanTag;
57     }
58
59     public void setElanTag(Long etag) {
60         elanTag = etag;
61     }
62
63     @Override
64     public List<Uint64> getDpnsHostingNetwork() {
65         return dpnIfaceList.values().stream().flatMap(dpnInterfaceInfo -> Stream.of(dpnInterfaceInfo.getDpId()))
66                 .collect(Collectors.toList());
67     }
68
69     public Collection<DpnInterfaceInfo> getDpnIfaceList() {
70         return dpnIfaceList.values();
71     }
72
73     @Nullable
74     public DpnInterfaceInfo getDpnIfaceInfo(Uint64 dpId) {
75         return dpId != null ? dpnIfaceList.get(dpId) : null;
76     }
77
78     public void setRSPuntFlowStatusOnDpnId(Uint64 dpnId, int action) {
79         DpnInterfaceInfo dpnInterface = getDpnIfaceInfo(dpnId);
80         if (null != dpnInterface) {
81             dpnInterface.setRsFlowConfiguredStatus(action);
82         }
83     }
84
85     public int getRSPuntFlowStatusOnDpnId(Uint64 dpnId) {
86         DpnInterfaceInfo dpnInterface = getDpnIfaceInfo(dpnId);
87         if (null != dpnInterface) {
88             return dpnInterface.getRsFlowConfiguredStatus();
89         }
90         return Ipv6ServiceConstants.FLOWS_NOT_CONFIGURED;
91     }
92
93     public void clearDpnInterfaceList() {
94         dpnIfaceList.clear();
95     }
96
97     @Override
98     public String toString() {
99         return "VirtualNetwork [networkUUID=" + networkUUID + " dpnIfaceList=" + dpnIfaceList + "]";
100     }
101
102     public void removeSelf() {
103         synchronized (networkUUID.getValue()) {
104             dpnIfaceList.values().forEach(dpnInterfaceInfo -> {
105                 dpnInterfaceInfo.clearPortList();
106                 dpnInterfaceInfo.clearNdTargetFlowInfo();
107                 dpnInterfaceInfo.clearsubnetCidrPuntFlowInfo();
108                 dpnInterfaceInfo.clearOvsNaResponderFlowConfigured();
109             });
110
111             clearDpnInterfaceList();
112         }
113     }
114
115     public void setMtu(int mtu) {
116         this.mtu = mtu;
117     }
118
119     @Override
120     public int getMtu() {
121         return this.mtu;
122     }
123
124     public static class DpnInterfaceInfo {
125         Uint64 dpId;
126         int rsPuntFlowConfigured;
127         final Set<Uuid> subnetCidrPuntFlowList = ConcurrentHashMap.newKeySet();
128         final Set<Ipv6Address> ndTargetFlowsPunted = ConcurrentHashMap.newKeySet();
129         ConcurrentMap<Long, Uuid> ofPortMap;
130         ConcurrentMap<Uuid, Integer> ovsNaResponderFlowConfigured;
131
132         DpnInterfaceInfo(Uint64 dpnId) {
133             dpId = dpnId;
134             ofPortMap = new ConcurrentHashMap();
135             rsPuntFlowConfigured = Ipv6ServiceConstants.FLOWS_NOT_CONFIGURED;
136             ovsNaResponderFlowConfigured = new ConcurrentHashMap();
137         }
138
139         public void setDpId(Uint64 dpId) {
140             this.dpId = dpId;
141         }
142
143         public Uint64 getDpId() {
144             return dpId;
145         }
146
147         public void setRsFlowConfiguredStatus(int status) {
148             this.rsPuntFlowConfigured = status;
149         }
150
151         public int getRsFlowConfiguredStatus() {
152             return rsPuntFlowConfigured;
153         }
154
155         public void updateSubnetCidrFlowStatus(Uuid subnetUUID, int addOrRemove) {
156             if (addOrRemove == Ipv6ServiceConstants.ADD_FLOW) {
157                 this.subnetCidrPuntFlowList.add(subnetUUID);
158             } else {
159                 this.subnetCidrPuntFlowList.remove(subnetUUID);
160             }
161         }
162
163         public boolean isSubnetCidrFlowAlreadyConfigured(Uuid subnetUUID) {
164             return subnetCidrPuntFlowList.contains(subnetUUID);
165         }
166
167         public Set<Ipv6Address> getNDTargetFlows() {
168             return ndTargetFlowsPunted;
169         }
170
171         public void updateNDTargetAddress(Ipv6Address ipv6Address, int addOrRemove) {
172             Ipv6Address ipv6 = Ipv6Address.getDefaultInstance(Ipv6Util.getFormattedIpv6Address(ipv6Address));
173             if (addOrRemove == Ipv6ServiceConstants.ADD_ENTRY) {
174                 this.ndTargetFlowsPunted.add(ipv6);
175             } else {
176                 this.ndTargetFlowsPunted.remove(ipv6);
177             }
178         }
179
180         public boolean isNdTargetFlowAlreadyConfigured(Ipv6Address ipv6Address) {
181             Ipv6Address ipv6 = Ipv6Address.getDefaultInstance(Ipv6Util.getFormattedIpv6Address(ipv6Address));
182             return this.ndTargetFlowsPunted.contains(ipv6);
183         }
184
185         public void clearNdTargetFlowInfo() {
186             this.ndTargetFlowsPunted.clear();
187         }
188
189         public void setOvsNaResponderFlowConfiguredStatus(Uuid interfaceName, int lportTag, int addOrRemove) {
190             if (addOrRemove == Ipv6ServiceConstants.ADD_ENTRY) {
191                 this.ovsNaResponderFlowConfigured.put(interfaceName, lportTag);
192             } else {
193                 this.ovsNaResponderFlowConfigured.remove(interfaceName);
194             }
195         }
196
197         public void clearOvsNaResponderFlowConfigured() {
198             this.ovsNaResponderFlowConfigured.clear();
199         }
200
201         public void updateofPortMap(Long ofPort, Uuid portId) {
202             this.ofPortMap.put(ofPort, portId);
203         }
204
205         public void removeOfPortFromMap(Long ofPort) {
206             this.ofPortMap.remove(ofPort);
207         }
208
209         public void clearPortList() {
210             this.ofPortMap.clear();
211         }
212
213         public void clearsubnetCidrPuntFlowInfo() {
214             this.subnetCidrPuntFlowList.clear();
215         }
216
217         @Override
218         public String toString() {
219             return "DpnInterfaceInfo [dpId=" + dpId + " rsPuntFlowConfigured=" + rsPuntFlowConfigured
220                     + "subnetCidrPuntFlowList=" + subnetCidrPuntFlowList + " ofPortMap ="
221                     + ofPortMap  + "]";
222         }
223     }
224 }