2 * Copyright (c) 2016 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
9 package org.opendaylight.netvirt.elan.utils;
13 import com.google.common.base.Optional;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryKey;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
30 public class ElanForwardingEntriesHandler {
32 private static final Logger LOG = LoggerFactory.getLogger(ElanForwardingEntriesHandler.class);
34 private final DataBroker broker;
35 private ElanUtils elanUtils;
38 public ElanForwardingEntriesHandler(DataBroker dataBroker) {
39 this.broker = dataBroker;
42 public void setElanUtils(ElanUtils elanUtils) {
43 this.elanUtils = elanUtils;
46 public void updateElanInterfaceForwardingTablesList(String elanInstanceName, String interfaceName,
47 String existingInterfaceName, MacEntry mac, WriteTransaction tx) {
48 if (existingInterfaceName.equals(interfaceName)) {
49 LOG.error(String.format(
50 "Static MAC address %s has already been added for the same ElanInstance "
51 + "%s on the same Logical Interface Port %s."
52 + " No operation will be done.",
53 mac.getMacAddress().toString(), elanInstanceName, interfaceName));
55 LOG.warn(String.format(
56 "Static MAC address %s had already been added for ElanInstance %s on Logical Interface Port %s. "
57 + "This would be considered as MAC movement scenario and old static mac will be removed "
58 + "and new static MAC will be added"
59 + "for ElanInstance %s on Logical Interface Port %s",
60 mac.getMacAddress().toString(), elanInstanceName, interfaceName, elanInstanceName, interfaceName));
61 //Update the ElanInterface Forwarding Container & ElanForwarding Container
62 deleteElanInterfaceForwardingTablesList(existingInterfaceName, mac, tx);
63 createElanInterfaceForwardingTablesList(interfaceName, mac, tx);
64 updateElanForwardingTablesList(elanInstanceName, interfaceName, mac, tx);
69 public void addElanInterfaceForwardingTableList(ElanInstance elanInstance, String interfaceName,
70 PhysAddress physAddress, WriteTransaction tx) {
71 MacEntry macEntry = new MacEntryBuilder().setIsStaticAddress(true).setMacAddress(physAddress)
72 .setInterface(interfaceName).setKey(new MacEntryKey(physAddress)).build();
73 createElanForwardingTablesList(elanInstance.getElanInstanceName(), macEntry, tx);
74 createElanInterfaceForwardingTablesList(interfaceName, macEntry, tx);
77 public void deleteElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
78 InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils
79 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
80 MacEntry existingInterfaceMacEntry = elanUtils
81 .getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
82 if (existingInterfaceMacEntry != null) {
83 tx.delete(LogicalDatastoreType.OPERATIONAL, existingMacEntryId);
87 public void createElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
88 InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils
89 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
90 MacEntry existingInterfaceMacEntry = elanUtils
91 .getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
92 if (existingInterfaceMacEntry == null) {
93 MacEntry macEntry = new MacEntryBuilder().setMacAddress(mac.getMacAddress()).setInterface(interfaceName)
94 .setIsStaticAddress(true).setKey(new MacEntryKey(mac.getMacAddress())).build();
95 tx.put(LogicalDatastoreType.OPERATIONAL, existingMacEntryId, macEntry, true);
99 public void updateElanForwardingTablesList(String elanName, String interfaceName, MacEntry mac,
100 WriteTransaction tx) {
101 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName,
102 mac.getMacAddress());
103 MacEntry existingMacEntry = elanUtils.getMacEntryFromElanMacId(macEntryId);
104 if (existingMacEntry != null && elanUtils.getElanMacTable(elanName) != null) {
105 MacEntry newMacEntry = new MacEntryBuilder().setInterface(interfaceName).setIsStaticAddress(true)
106 .setMacAddress(mac.getMacAddress()).setKey(new MacEntryKey(mac.getMacAddress())).build();
107 tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, newMacEntry);
111 private void createElanForwardingTablesList(String elanName, MacEntry macEntry, WriteTransaction tx) {
112 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName,
113 macEntry.getMacAddress());
114 Optional<MacEntry> existingMacEntry = elanUtils.read(broker, LogicalDatastoreType.OPERATIONAL, macEntryId);
115 if (!existingMacEntry.isPresent() && elanUtils.getElanMacTable(elanName) != null) {
116 tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, macEntry, true);
120 public void deleteElanInterfaceForwardingEntries(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
121 MacEntry macEntry, WriteTransaction tx) {
122 InstanceIdentifier<MacEntry> macEntryId = ElanUtils
123 .getMacEntryOperationalDataPath(elanInfo.getElanInstanceName(), macEntry.getMacAddress());
124 tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);
125 deleteElanInterfaceForwardingTablesList(interfaceInfo.getInterfaceName(), macEntry, tx);
126 WriteTransaction deleteFlowtx = broker.newWriteOnlyTransaction();
127 elanUtils.deleteMacFlows(elanInfo, interfaceInfo, macEntry, deleteFlowtx);
128 deleteFlowtx.submit();
131 public void deleteElanInterfaceMacForwardingEntries(String interfaceName, PhysAddress physAddress,
132 WriteTransaction tx) {
133 InstanceIdentifier<MacEntry> macEntryId = ElanUtils
134 .getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress);
135 tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);