2 * Copyright (c) 2013 Cisco Systems, 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.openflowplugin.openflow.md.core.session;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.HashMap;
14 import java.util.List;
16 import java.util.Map.Entry;
18 import java.util.concurrent.ConcurrentHashMap;
19 import java.util.concurrent.atomic.AtomicLong;
21 import com.google.common.cache.Cache;
22 import com.google.common.cache.CacheBuilder;
24 import java.util.concurrent.TimeUnit;
26 import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
27 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
28 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
31 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
36 public class SessionContextOFImpl implements SessionContext {
38 private GetFeaturesOutput features;
39 private ConnectionConductor primaryConductor;
40 private ConcurrentHashMap<SwitchConnectionDistinguisher, ConnectionConductor> auxiliaryConductors;
41 private boolean valid;
42 private SwitchSessionKeyOF sessionKey;
43 private IMessageDispatchService mdService;
44 private final AtomicLong xid;
45 private final Map<Long, PortGrouping> physicalPorts;
46 private final Map<Long, Boolean> portBandwidth;
47 private Cache<TransactionKey, Object> bulkTransactionCache = CacheBuilder.newBuilder().expireAfterWrite(10000, TimeUnit.MILLISECONDS).concurrencyLevel(1).build();
48 private CompositeObjectRegistration<ModelDrivenSwitch> providerRegistration;
55 public SessionContextOFImpl() {
56 auxiliaryConductors = new ConcurrentHashMap<>();
57 mdService = new MessageDispatchServiceImpl(this);
58 xid = new AtomicLong();
59 this.physicalPorts = new HashMap<Long, PortGrouping>();
60 this.portBandwidth = new HashMap<Long, Boolean>();
64 public ConnectionConductor getPrimaryConductor() {
65 return primaryConductor;
69 public ConnectionConductor getAuxiliaryConductor(
70 SwitchConnectionDistinguisher auxiliaryKey) {
71 return auxiliaryConductors.get(auxiliaryKey);
75 public void addAuxiliaryConductor(
76 SwitchConnectionDistinguisher auxiliaryKey,
77 ConnectionConductor conductor) {
78 auxiliaryConductors.put(auxiliaryKey, conductor);
82 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
83 return Collections.unmodifiableSet(auxiliaryConductors.entrySet());
87 public Cache<TransactionKey, Object> getbulkTransactionCache() {
88 return bulkTransactionCache;
92 public GetFeaturesOutput getFeatures() {
100 public void setFeatures(GetFeaturesOutput features) {
101 this.features = features;
105 * @param primaryConductor
106 * the primaryConductor to set
108 public void setPrimaryConductor(ConnectionConductor primaryConductor) {
109 this.primaryConductor = primaryConductor;
113 public ConnectionConductor removeAuxiliaryConductor(
114 SwitchConnectionDistinguisher connectionCookie) {
115 return auxiliaryConductors.remove(connectionCookie);
119 public boolean isValid() {
124 public void setValid(boolean valid) {
129 * @param sessionKey the sessionKey to set
131 public void setSessionKey(SwitchSessionKeyOF sessionKey) {
132 this.sessionKey = sessionKey;
136 * @param seed the seed to set
138 public void setSeed(int seed) {
143 public SwitchSessionKeyOF getSessionKey() {
148 public IMessageDispatchService getMessageDispatchService() {
153 public Long getNextXid() {
154 return xid.incrementAndGet();
158 public Map<Long, PortGrouping> getPhysicalPorts() {
159 return this.physicalPorts;
163 public Map<Long, Boolean> getPortsBandwidth() {
164 return this.portBandwidth;
168 public Set<Long> getPorts() {
169 return this.physicalPorts.keySet();
173 public PortGrouping getPhysicalPort(Long portNumber) {
174 return this.physicalPorts.get(portNumber);
178 public Boolean getPortBandwidth(Long portNumber) {
179 return this.portBandwidth.get(portNumber);
183 public boolean isPortEnabled(long portNumber) {
184 return isPortEnabled(physicalPorts.get(portNumber));
188 public boolean isPortEnabled(PortGrouping port) {
192 if (port.getConfig().isPortDown()) {
195 if (port.getState().isLinkDown()) {
198 if (port.getState().isBlocked()) {
205 public List<PortGrouping> getEnabledPorts() {
206 List<PortGrouping> result = new ArrayList<PortGrouping>();
207 synchronized (this.physicalPorts) {
208 for (PortGrouping port : physicalPorts.values()) {
209 if (isPortEnabled(port)) {
218 public void setProviderRegistration(
219 CompositeObjectRegistration<ModelDrivenSwitch> providerRegistration) {
220 this.providerRegistration = providerRegistration;
224 public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
225 return providerRegistration;
229 public int getSeed() {