b2a588571a70c6bd362fde89764f70498a609bd7
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / state / BGPSessionStateImpl.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, 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
9 package org.opendaylight.protocol.bgp.rib.impl.state;
10
11 import com.google.common.base.Stopwatch;
12 import java.net.InetSocketAddress;
13 import java.net.SocketAddress;
14 import java.util.List;
15 import java.util.Set;
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.rev171207.open.message.BgpParameters;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.bgp.parameters.OptionalCapabilities;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev171207.open.message.bgp.parameters.optional.capabilities.CParameters;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.BgpTableType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.CParameters1;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev171207.mp.capabilities.MultiprotocolCapability;
35 import org.opendaylight.yangtools.yang.binding.Notification;
36
37 @ThreadSafe
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;
46     @GuardedBy("this")
47     private boolean addPathCapability;
48     @GuardedBy("this")
49     private boolean asn32Capability;
50     @GuardedBy("this")
51     private boolean gracefulRestartCapability;
52     @GuardedBy("this")
53     private boolean multiProtocolCapability;
54     @GuardedBy("this")
55     private boolean routerRefreshCapability;
56     @GuardedBy("this")
57     private State sessionState;
58     @GuardedBy("this")
59     private BGPMessagesListener messagesListenerCounter;
60
61     public BGPSessionStateImpl() {
62         this.sessionState = State.OPEN_CONFIRM;
63         this.sessionStopwatch = Stopwatch.createUnstarted();
64     }
65
66     @Override
67     public synchronized void messageSent(final Notification msg) {
68         if (this.messagesListenerCounter != null) {
69             this.messagesListenerCounter.messageSent(msg);
70         }
71     }
72
73     @Override
74     public synchronized void messageReceived(final Notification msg) {
75         if (this.messagesListenerCounter != null) {
76             this.messagesListenerCounter.messageReceived(msg);
77         }
78     }
79
80     @Override
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();
90                         if (mc != null) {
91                             this.multiProtocolCapability = true;
92                         }
93                         if (capabilities.getGracefulRestartCapability() != null) {
94                             this.gracefulRestartCapability = true;
95                         }
96                         if (capabilities.getAddPathCapability() != null) {
97                             this.addPathCapability = true;
98                         }
99                         if (capabilities.getRouteRefreshCapability() != null) {
100                             this.routerRefreshCapability = true;
101                         }
102                     }
103                     if (cParam.getAs4BytesCapability() != null) {
104                         this.asn32Capability = true;
105                     }
106                 }
107             }
108         }
109
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());
114     }
115
116     @Override
117     public synchronized State getSessionState() {
118         return this.sessionState;
119     }
120
121     @Override
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();
127         }
128         this.sessionState = state;
129     }
130
131     @Override
132     public synchronized boolean isAddPathCapabilitySupported() {
133         return this.addPathCapability;
134     }
135
136     @Override
137     public synchronized boolean isAsn32CapabilitySupported() {
138         return this.asn32Capability;
139     }
140
141     @Override
142     public synchronized boolean isGracefulRestartCapabilitySupported() {
143         return this.gracefulRestartCapability;
144     }
145
146     @Override
147     public synchronized boolean isMultiProtocolCapabilitySupported() {
148         return this.multiProtocolCapability;
149     }
150
151     @Override
152     public synchronized boolean isRouterRefreshCapabilitySupported() {
153         return this.routerRefreshCapability;
154     }
155
156     @Override
157     public synchronized PortNumber getLocalPort() {
158         return this.localPort;
159     }
160
161     @Override
162     public synchronized IpAddress getRemoteAddress() {
163         return this.remoteAddress;
164     }
165
166     @Nonnull
167     @Override
168     public synchronized PortNumber getRemotePort() {
169         return this.remotePort;
170     }
171
172     @Override
173     public synchronized long getNegotiatedHoldTime() {
174         return this.holdTimerValue;
175     }
176
177     @Override
178     public synchronized long getUpTime() {
179         return this.sessionStopwatch.elapsed(TimeUnit.MILLISECONDS);
180     }
181
182     public synchronized void registerMessagesCounter(final BGPMessagesListener bgpMessagesListener) {
183         this.messagesListenerCounter= bgpMessagesListener;
184     }
185 }