2 * Copyright © 2015, 2017 Ericsson India Global Services Pvt Ltd. 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
8 package org.opendaylight.netvirt.bgpmanager;
10 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.List;
15 import javax.annotation.Nullable;
16 import javax.annotation.PostConstruct;
17 import javax.annotation.PreDestroy;
18 import javax.inject.Inject;
19 import javax.inject.Singleton;
20 import org.apache.thrift.TException;
21 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
22 import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmErrorCodes;
23 import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
24 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
25 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
26 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
27 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.AddressFamily;
28 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
29 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.TcpMd5SignaturePasswordType;
30 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 public class BgpManager implements AutoCloseable, IBgpManager {
37 private static final Logger LOG = LoggerFactory.getLogger(BgpManager.class);
38 private final BgpConfigurationManager bcm;
40 private final FibDSWriter fibDSWriter;
41 private volatile long qbgprestartTS = 0;
44 public BgpManager(final BgpConfigurationManager bcm, final FibDSWriter fibDSWriter) {
46 this.fibDSWriter = fibDSWriter;
51 LOG.info("{} start", getClass().getSimpleName());
56 public void close() throws Exception {
57 LOG.info("{} close", getClass().getSimpleName());
60 public BgpConfigurationManager getBgpConfigurationManager() {
64 public void configureGR(int stalepathTime) throws TException {
65 bcm.addGracefulRestart(stalepathTime);
68 public void delGracefulRestart() throws Exception {
69 bcm.delGracefulRestart();
72 public void addNeighbor(String ipAddress, long asNum,
73 @Nullable final TcpMd5SignaturePasswordType md5Password) throws TException {
74 bcm.addNeighbor(ipAddress, asNum, md5Password);
77 public void addEbgpMultihop(String ipAddress, int nhops) throws TException {
78 bcm.addEbgpMultihop(ipAddress, nhops);
81 public void addUpdateSource(String ipAddress, String srcIp) throws TException {
82 bcm.addUpdateSource(ipAddress, srcIp);
85 public void addAddressFamily(String ipAddress, af_afi afi, af_safi safi) throws TException {
86 bcm.addAddressFamily(ipAddress, afi.getValue(), safi.getValue());
89 public void deleteNeighbor(String ipAddress) throws TException {
90 bcm.delNeighbor(ipAddress);
94 public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts,
95 AddressFamily addressFamily) throws Exception {
96 bcm.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts), addressFamily);
100 public void deleteVrf(String rd, boolean removeFibTable, AddressFamily addressFamily) {
102 if (removeFibTable) {
103 LOG.info("deleteVrf: suppressing FIB from rd {} with {}", rd, addressFamily);
104 fibDSWriter.removeVrfSubFamilyFromDS(rd, addressFamily);
106 ret = bcm.delVrf(rd, addressFamily);
107 if (ret && removeFibTable) {
108 fibDSWriter.removeVrfFromDS(rd);
113 public void addPrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
114 VrfEntry.EncapType encapType, int vpnLabel, long l3vni,
115 String gatewayMac, RouteOrigin origin)
117 fibDSWriter.addFibEntryToDS(rd, macAddress, prefix, nextHopList,
118 encapType, vpnLabel, l3vni, gatewayMac, origin);
119 bcm.addPrefix(rd, macAddress, prefix, nextHopList,
120 encapType, vpnLabel, l3vni, 0 /*l2vni*/, gatewayMac);
124 public void addPrefix(String rd, String macAddress, String prefix, String nextHop, VrfEntry.EncapType encapType,
125 int vpnLabel, long l3vni, String gatewayMac, RouteOrigin origin) throws Exception {
126 addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType, vpnLabel, l3vni,
131 public void deletePrefix(String rd, String prefix) {
132 fibDSWriter.removeFibEntryFromDS(rd, prefix);
133 bcm.delPrefix(rd, prefix);
137 public void advertisePrefix(String rd, String macAddress, String prefix, List<String> nextHopList,
138 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
139 String gatewayMac) throws Exception {
140 LOG.info("Advertise Prefix: Adding Prefix rd {} prefix {} label {} l3vni {} l2vni {}",
141 rd, prefix, vpnLabel, l3vni, l2vni);
142 bcm.addPrefix(rd, macAddress, prefix, nextHopList,
143 encapType, vpnLabel, l3vni, l2vni, gatewayMac);
144 LOG.info("Advertise Prefix: Added Prefix rd {} prefix {} label {} l3vni {} l2vni {}",
145 rd, prefix, vpnLabel, l3vni, l2vni);
149 public void advertisePrefix(String rd, String macAddress, String prefix, String nextHop,
150 VrfEntry.EncapType encapType, long vpnLabel, long l3vni, long l2vni,
151 String gatewayMac) throws Exception {
152 LOG.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {} l3vni {} l2vni {}",
153 rd, prefix, nextHop, vpnLabel, l3vni, l2vni);
154 bcm.addPrefix(rd, macAddress, prefix, Collections.singletonList(nextHop), encapType,
155 vpnLabel, l3vni, l2vni, gatewayMac);
156 LOG.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {} l3vni {} l2vni {}",
157 rd, prefix, nextHop, vpnLabel, l3vni, l2vni);
161 public void withdrawPrefix(String rd, String prefix) {
162 LOG.info("WITHDRAW: Removing Prefix rd {} prefix {} afi {}", rd, prefix);
163 bcm.delPrefix(rd, prefix);
164 LOG.info("WITHDRAW: Removed Prefix rd {} prefix {} afi {}", rd, prefix);
168 public void setQbgpLog(String fileName, String debugLevel) {
169 bcm.addLogging(fileName, debugLevel);
172 public void delLogging() {
176 public void startBgp(long asn, String routerId, int spt, boolean fbit) {
177 bcm.startBgp(asn, routerId, spt, fbit);
180 public void stopBgp() {
184 public void startConfig(String host, int port) {
185 bcm.startConfig(host, port);
188 public void stopConfig() {
192 public Bgp getConfig() {
193 return bcm.getConfig();
197 public void enableMultipath(af_afi afi, af_safi safi) {
198 bcm.setMultipathStatus(afi, safi,true);
201 public void disableMultipath(af_afi afi, af_safi safi) {
202 bcm.setMultipathStatus(afi, safi, false);
205 public void multipaths(String rd, int maxpath) {
206 bcm.multipaths(rd, maxpath);
210 public String getDCGwIP() {
211 Bgp conf = bcm.getConfig();
215 List<Neighbors> nbrs = conf.getNeighbors();
219 return nbrs.get(0).getAddress().getValue();
223 // This method doesn't actually do any real work currently but may at some point so suppress FindBugs violation.
224 @SuppressFBWarnings("UC_USELESS_VOID_METHOD")
225 public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
226 if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
227 // CEASE Notifications alone have to be reported to the CBA.
228 // Silently return here. No need to log because tons
229 // of non-alarm notifications will be sent to the SDNc.
232 BgpAlarmErrorCodes errorSubCode = BgpAlarmErrorCodes.checkErrorSubcode(subcode);
233 if (errorSubCode == BgpAlarmErrorCodes.ERROR_IGNORE) {
234 // Need to report only those subcodes, defined in
235 // BgpAlarmErrorCodes enum class.
240 public FibDSWriter getFibWriter() {
244 public String getConfigHost() {
245 return bcm.getConfigHost();
248 public int getConfigPort() {
249 return bcm.getConfigPort();
254 public void bgpRestarted() {
258 public BgpManager getBgpManager() {
262 public boolean isBgpConnected() {
263 return bcm.isBgpConnected();
266 public long getLastConnectedTS() {
267 return bcm.getLastConnectedTS();
270 public long getConnectTS() {
271 return bcm.getConnectTS();
274 public long getStartTS() {
275 return bcm.getStartTS();
278 public long getQbgprestartTS() {
279 return qbgprestartTS;
283 public void setQbgprestartTS(long qbgprestartTS) {
284 this.qbgprestartTS = qbgprestartTS;
287 public long getStaleStartTime() {
288 return bcm.getStaleStartTime();
291 public long getStaleEndTime() {
292 return bcm.getStaleEndTime();
295 public long getCfgReplayStartTime() {
296 return bcm.getCfgReplayStartTime();
299 public long getCfgReplayEndTime() {
300 return bcm.getCfgReplayEndTime();
303 public long getStaleCleanupTime() {
304 return bcm.getStaleCleanupTime();