2 * Copyright (c) 2016 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.protocol.bgp.rib.impl.state;
11 import com.google.common.base.Stopwatch;
12 import java.net.InetSocketAddress;
13 import java.net.SocketAddress;
14 import java.util.List;
16 import java.util.concurrent.TimeUnit;
17 import javax.annotation.Nonnull;
18 import javax.annotation.concurrent.GuardedBy;
19 import javax.annotation.concurrent.ThreadSafe;
20 import org.opendaylight.protocol.bgp.rib.impl.StrictBGPPeerRegistry;
21 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPMessagesListener;
22 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionStateListener;
23 import org.opendaylight.protocol.bgp.rib.spi.State;
24 import org.opendaylight.protocol.bgp.rib.spi.state.BGPSessionState;
25 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTimersState;
26 import org.opendaylight.protocol.bgp.rib.spi.state.BGPTransportState;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.BgpParameters;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.OptionalCapabilities;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParameters;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.MultiprotocolCapability;
35 import org.opendaylight.yangtools.yang.binding.Notification;
38 public final class BGPSessionStateImpl implements BGPSessionState, BGPTimersState, BGPTransportState,
39 BGPSessionStateListener {
40 private static final PortNumber NON_DEFINED_PORT = new PortNumber(0);
41 private final Stopwatch sessionStopwatch;
42 private int holdTimerValue;
43 private IpAddress remoteAddress;
44 private PortNumber remotePort = NON_DEFINED_PORT;
45 private PortNumber localPort = NON_DEFINED_PORT;
47 private boolean addPathCapability;
49 private boolean asn32Capability;
51 private boolean gracefulRestartCapability;
53 private boolean multiProtocolCapability;
55 private boolean routerRefreshCapability;
57 private State sessionState;
59 private BGPMessagesListener messagesListenerCounter;
61 public BGPSessionStateImpl() {
62 this.sessionState = State.OPEN_CONFIRM;
63 this.sessionStopwatch = Stopwatch.createUnstarted();
67 public synchronized void messageSent(final Notification msg) {
68 if (this.messagesListenerCounter != null) {
69 this.messagesListenerCounter.messageSent(msg);
74 public synchronized void messageReceived(final Notification msg) {
75 if (this.messagesListenerCounter != null) {
76 this.messagesListenerCounter.messageReceived(msg);
81 public synchronized void advertizeCapabilities(final int holdTimerValue, final SocketAddress remoteAddress,
82 final SocketAddress localAddress, final Set<BgpTableType> tableTypes, final List<BgpParameters> bgpParameters) {
83 if (bgpParameters != null && !bgpParameters.isEmpty()) {
84 for (final BgpParameters parameters : bgpParameters) {
85 for (final OptionalCapabilities optionalCapabilities : parameters.getOptionalCapabilities()) {
86 final CParameters cParam = optionalCapabilities.getCParameters();
87 final CParameters1 capabilities = cParam.getAugmentation(CParameters1.class);
88 if (capabilities != null) {
89 final MultiprotocolCapability mc = capabilities.getMultiprotocolCapability();
91 this.multiProtocolCapability = true;
93 if (capabilities.getGracefulRestartCapability() != null) {
94 this.gracefulRestartCapability = true;
96 if (capabilities.getAddPathCapability() != null) {
97 this.addPathCapability = true;
99 if (capabilities.getRouteRefreshCapability() != null) {
100 this.routerRefreshCapability = true;
103 if (cParam.getAs4BytesCapability() != null) {
104 this.asn32Capability = true;
110 this.holdTimerValue = holdTimerValue;
111 this.remoteAddress = StrictBGPPeerRegistry.getIpAddress(remoteAddress);
112 this.remotePort = new PortNumber(((InetSocketAddress) remoteAddress).getPort());
113 this.localPort = new PortNumber(((InetSocketAddress) localAddress).getPort());
117 public synchronized State getSessionState() {
118 return this.sessionState;
122 public synchronized void setSessionState(@Nonnull State state) {
123 if (state == State.IDLE) {
124 this.sessionStopwatch.reset();
125 } else if (state == State.UP) {
126 this.sessionStopwatch.start();
128 this.sessionState = state;
132 public synchronized boolean isAddPathCapabilitySupported() {
133 return this.addPathCapability;
137 public synchronized boolean isAsn32CapabilitySupported() {
138 return this.asn32Capability;
142 public synchronized boolean isGracefulRestartCapabilitySupported() {
143 return this.gracefulRestartCapability;
147 public synchronized boolean isMultiProtocolCapabilitySupported() {
148 return this.multiProtocolCapability;
152 public synchronized boolean isRouterRefreshCapabilitySupported() {
153 return this.routerRefreshCapability;
157 public synchronized PortNumber getLocalPort() {
158 return this.localPort;
162 public synchronized IpAddress getRemoteAddress() {
163 return this.remoteAddress;
168 public synchronized PortNumber getRemotePort() {
169 return this.remotePort;
173 public synchronized long getNegotiatedHoldTime() {
174 return this.holdTimerValue;
178 public synchronized long getUpTime() {
179 return this.sessionStopwatch.elapsed(TimeUnit.MILLISECONDS);
182 public synchronized void registerMessagesCounter(final BGPMessagesListener bgpMessagesListener) {
183 this.messagesListenerCounter= bgpMessagesListener;