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 org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryKey;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
28 public class ElanForwardingEntriesHandler {
30 private static final Logger LOG = LoggerFactory.getLogger(ElanForwardingEntriesHandler.class);
32 private final DataBroker broker;
33 private ElanUtils elanUtils;
35 public ElanForwardingEntriesHandler(DataBroker dataBroker) {
36 this.broker = dataBroker;
39 public void setElanUtils(ElanUtils elanUtils) {
40 this.elanUtils = elanUtils;
43 public void updateElanInterfaceForwardingTablesList(String elanInstanceName, String interfaceName, String existingInterfaceName, MacEntry mac, WriteTransaction tx) {
44 if (existingInterfaceName.equals(interfaceName)) {
45 LOG.error(String.format("Static MAC address %s has already been added for the same ElanInstance %s on the same Logical Interface Port %s."
46 + " No operation will be done.", mac.getMacAddress().toString(), elanInstanceName, interfaceName));
48 LOG.warn(String.format("Static MAC address %s had already been added for ElanInstance %s on Logical Interface Port %s. "
49 + "This would be considered as MAC movement scenario and old static mac will be removed and new static MAC will be added"
50 + "for ElanInstance %s on Logical Interface Port %s", mac.getMacAddress().toString(), elanInstanceName, interfaceName, elanInstanceName, interfaceName));
51 //Update the ElanInterface Forwarding Container & ElanForwarding Container
52 deleteElanInterfaceForwardingTablesList(existingInterfaceName, mac, tx);
53 createElanInterfaceForwardingTablesList(interfaceName, mac, tx);
54 updateElanForwardingTablesList(elanInstanceName, interfaceName, mac, tx);
59 public void addElanInterfaceForwardingTableList(ElanInstance elanInstance, String interfaceName, PhysAddress physAddress, WriteTransaction tx) {
60 MacEntry macEntry = new MacEntryBuilder().setIsStaticAddress(true).setMacAddress(physAddress).setInterface(interfaceName).setKey(new MacEntryKey(physAddress)).build();
61 createElanForwardingTablesList(elanInstance.getElanInstanceName(), macEntry, tx);
62 createElanInterfaceForwardingTablesList(interfaceName, macEntry, tx);
65 public void deleteElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
66 InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
67 MacEntry existingInterfaceMacEntry = elanUtils.getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
68 if (existingInterfaceMacEntry != null) {
69 tx.delete(LogicalDatastoreType.OPERATIONAL, existingMacEntryId);
73 public void createElanInterfaceForwardingTablesList(String interfaceName, MacEntry mac, WriteTransaction tx) {
74 InstanceIdentifier<MacEntry> existingMacEntryId = ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, mac.getMacAddress());
75 MacEntry existingInterfaceMacEntry = elanUtils.getInterfaceMacEntriesOperationalDataPathFromId(existingMacEntryId);
76 if (existingInterfaceMacEntry == null) {
77 MacEntry macEntry = new MacEntryBuilder().setMacAddress(mac.getMacAddress()).setInterface(interfaceName).setIsStaticAddress(true).setKey(new MacEntryKey(mac.getMacAddress())).build();
78 tx.put(LogicalDatastoreType.OPERATIONAL, existingMacEntryId, macEntry);
83 public void updateElanForwardingTablesList(String elanName, String interfaceName, MacEntry mac, WriteTransaction tx) {
84 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName, mac.getMacAddress());
85 MacEntry existingMacEntry = elanUtils.getMacEntryFromElanMacId(macEntryId);
86 if (existingMacEntry != null) {
87 // Fix for TR HU71400.
88 // ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, macEntryId);
89 MacEntry newMacEntry = new MacEntryBuilder().setInterface(interfaceName).setIsStaticAddress(true).setMacAddress(mac.getMacAddress()).setKey(new MacEntryKey(mac.getMacAddress())).build();
90 tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, newMacEntry);
94 private void createElanForwardingTablesList(String elanName, MacEntry macEntry, WriteTransaction tx) {
95 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanName, macEntry.getMacAddress());
96 Optional<MacEntry> existingMacEntry = elanUtils.read(broker, LogicalDatastoreType.OPERATIONAL, macEntryId);
97 if (!existingMacEntry.isPresent()) {
98 tx.put(LogicalDatastoreType.OPERATIONAL, macEntryId, macEntry);
102 public void deleteElanInterfaceForwardingEntries(ElanInstance elanInfo, InterfaceInfo interfaceInfo, MacEntry macEntry, WriteTransaction tx) {
103 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getMacEntryOperationalDataPath(elanInfo.getElanInstanceName(), macEntry.getMacAddress());
104 tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);
105 deleteElanInterfaceForwardingTablesList(interfaceInfo.getInterfaceName(), macEntry, tx);
106 WriteTransaction deleteFlowtx = broker.newWriteOnlyTransaction();
107 elanUtils.deleteMacFlows(elanInfo, interfaceInfo, macEntry, deleteFlowtx);
108 deleteFlowtx.submit();
111 public void deleteElanInterfaceMacForwardingEntries(String interfaceName, PhysAddress physAddress, WriteTransaction tx) {
112 InstanceIdentifier<MacEntry> macEntryId = ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress);
113 tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryId);