2 * Copyright (c) 2017 Ericsson 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.netvirt.sfc.classifier.service.domain.impl;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
15 import org.opendaylight.netvirt.sfc.classifier.providers.GeniusProvider;
16 import org.opendaylight.netvirt.sfc.classifier.providers.OpenFlow13Provider;
17 import org.opendaylight.netvirt.sfc.classifier.service.domain.api.ClassifierEntryRenderer;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.Matches;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 public class OpenflowRenderer implements ClassifierEntryRenderer {
27 private static final Logger LOG = LoggerFactory.getLogger(OpenflowRenderer.class);
29 private final OpenFlow13Provider openFlow13Provider;
30 private final GeniusProvider geniusProvider;
31 private final DataBroker dataBroker;
33 public OpenflowRenderer(OpenFlow13Provider openFlow13Provider, GeniusProvider geniusProvider,
34 DataBroker dataBroker) {
35 this.openFlow13Provider = openFlow13Provider;
36 this.geniusProvider = geniusProvider;
37 this.dataBroker = dataBroker;
41 public void renderIngress(InterfaceKey interfaceKey) {
46 public void renderNode(NodeId nodeId) {
47 List<Flow> flows = new ArrayList<>();
48 flows.add(this.openFlow13Provider.createIngressClassifierFilterVxgpeNshFlow(nodeId));
49 flows.add(this.openFlow13Provider.createIngressClassifierFilterEthNshFlow(nodeId));
50 flows.add(this.openFlow13Provider.createIngressClassifierFilterNoNshFlow(nodeId));
51 flows.add(this.openFlow13Provider.createIngressClassifierAclNoMatchFlow(nodeId));
53 flows.add(this.openFlow13Provider.createEgressClassifierFilterNshFlow(nodeId));
54 flows.add(this.openFlow13Provider.createEgressClassifierFilterNoNshFlow(nodeId));
56 flows.add(this.openFlow13Provider.createEgressClassifierNextHopC1C2Flow(nodeId));
57 flows.add(this.openFlow13Provider.createEgressClassifierNextHopNoC1C2Flow(nodeId));
59 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
60 flows.forEach(flow -> this.openFlow13Provider.appendFlowForCreate(nodeId, flow, tx));
65 public void renderPath(NodeId nodeId, Long nsp, String firstHopIp) {
66 Long port = geniusProvider.getEgressVxlanPortForNode(OpenFlow13Provider.getDpnIdFromNodeId(nodeId))
70 LOG.error("OpenflowRenderer: cant get egressPort for nodeId [{}]", nodeId.getValue());
74 Flow flow = firstHopIp == null
75 ? openFlow13Provider.createEgressClassifierTransportEgressLocalFlow(nodeId, nsp)
76 : openFlow13Provider.createEgressClassifierTransportEgressRemoteFlow(nodeId, nsp, port, firstHopIp);
78 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
79 this.openFlow13Provider.appendFlowForCreate(nodeId, flow, tx);
84 public void renderMatch(NodeId nodeId, String connector, Matches matches, Long nsp, Short nsi) {
85 Long port = OpenFlow13Provider.getPortNoFromNodeConnector(connector);
86 Flow flow = this.openFlow13Provider.createIngressClassifierAclFlow(
87 nodeId, this.openFlow13Provider.getMatchBuilderFromAceMatches(matches), port, nsp, nsi);
89 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
90 this.openFlow13Provider.appendFlowForCreate(nodeId, flow, tx);
95 public void renderEgress(InterfaceKey interfaceKey, String destinationIp) {
100 public void suppressIngress(InterfaceKey interfaceKey) {
105 public void suppressNode(NodeId nodeId) {
106 List<Flow> flows = new ArrayList<>();
107 flows.add(this.openFlow13Provider.createIngressClassifierFilterVxgpeNshFlow(nodeId));
108 flows.add(this.openFlow13Provider.createIngressClassifierFilterEthNshFlow(nodeId));
109 flows.add(this.openFlow13Provider.createIngressClassifierFilterNoNshFlow(nodeId));
111 flows.add(this.openFlow13Provider.createEgressClassifierFilterNshFlow(nodeId));
112 flows.add(this.openFlow13Provider.createEgressClassifierFilterNoNshFlow(nodeId));
114 flows.add(this.openFlow13Provider.createEgressClassifierNextHopC1C2Flow(nodeId));
115 flows.add(this.openFlow13Provider.createEgressClassifierNextHopNoC1C2Flow(nodeId));
117 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
118 flows.forEach(flow -> this.openFlow13Provider.appendFlowForDelete(nodeId, flow, tx));
123 public void suppressPath(NodeId nodeId, Long nsp, String firstHopIp) {
124 Long port = geniusProvider.getEgressVxlanPortForNode(OpenFlow13Provider.getDpnIdFromNodeId(nodeId))
128 LOG.error("OpenflowRenderer: cant get egressPort for nodeId [{}]", nodeId.getValue());
132 Flow flow = firstHopIp == null
133 ? openFlow13Provider.createEgressClassifierTransportEgressLocalFlow(nodeId, nsp)
134 : openFlow13Provider.createEgressClassifierTransportEgressRemoteFlow(nodeId, nsp, port, firstHopIp);
136 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
137 this.openFlow13Provider.appendFlowForCreate(nodeId, flow, tx);
142 public void suppressMatch(NodeId nodeId, String connector, Matches matches, Long nsp, Short nsi) {
143 Long port = OpenFlow13Provider.getPortNoFromNodeConnector(connector);
144 Flow flow = this.openFlow13Provider.createIngressClassifierAclFlow(
145 nodeId, this.openFlow13Provider.getMatchBuilderFromAceMatches(matches), port, nsp, nsi);
147 WriteTransaction tx = this.dataBroker.newWriteOnlyTransaction();
148 this.openFlow13Provider.appendFlowForDelete(nodeId, flow, tx);
153 public void suppressEgress(InterfaceKey interfaceKey, String destinationIp) {