2 * Copyright (c) 2013 Ericsson AB. 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
10 package org.opendaylight.vpnservice.mdsalutil;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
17 import java.util.concurrent.ConcurrentHashMap;
18 import java.util.concurrent.LinkedBlockingQueue;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
53 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
56 import com.google.common.base.Joiner;
57 import com.google.common.primitives.Bytes;
58 import com.google.common.primitives.Ints;
60 public class MDSALUtil {
62 public static final String NODE_PREFIX = "openflow";
63 public static final String SEPARATOR = ":";
64 private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
65 private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
66 new ArrayList<Instruction>()).build();
67 private static final Match EMPTY_Matches = new MatchBuilder().build();
69 public static FlowEntity buildFlowEntity(long dpnId, short tableId, String flowId, int priority, String flowName,
70 int idleTimeOut, int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
71 List<InstructionInfo> listInstructionInfo) {
73 FlowEntity flowEntity = new FlowEntity(dpnId);
75 flowEntity.setTableId(tableId);
76 flowEntity.setFlowId(flowId);
77 flowEntity.setPriority(priority);
78 flowEntity.setFlowName(flowName);
79 flowEntity.setIdleTimeOut(idleTimeOut);
80 flowEntity.setHardTimeOut(hardTimeOut);
81 flowEntity.setCookie(cookie);
82 flowEntity.setMatchInfoList(listMatchInfo);
83 flowEntity.setInstructionInfoList(listInstructionInfo);
88 // TODO: CHECK IF THIS IS USED
89 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
90 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<InstructionInfo> listInstructionInfo) {
91 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
92 listMatchInfo, listInstructionInfo, true);
95 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
96 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
97 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
98 FlowKey key = new FlowKey(new FlowId(flowId));
99 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
100 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
101 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
102 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
103 .setCookie(new FlowCookie(cookie)).build();
106 public static GroupEntity buildGroupEntity(long dpnId, long groupId, String groupName, GroupTypes groupType,
107 List<BucketInfo> listBucketInfo) {
109 GroupEntity groupEntity = new GroupEntity(dpnId);
111 groupEntity.setGroupId(groupId);
112 groupEntity.setGroupName(groupName);
113 groupEntity.setGroupType(groupType);
114 groupEntity.setBucketInfoList(listBucketInfo);
119 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, long dpnId) {
120 return new TransmitPacketInputBuilder()
121 .setAction(buildActions(actionInfos))
124 new NodeRef(InstanceIdentifier.builder(Nodes.class)
125 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
126 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
129 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
130 NodeConnectorRef ingress) {
131 return new TransmitPacketInputBuilder()
132 .setAction(buildActions(actionInfos))
135 new NodeRef(InstanceIdentifier.builder(Nodes.class)
136 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
137 .setIngress(ingress).setEgress(ingress).build();
140 private static List<Action> buildActions(List<ActionInfo> actions) {
141 List<Action> actionsList = new ArrayList<Action>();
142 for (ActionInfo actionInfo : actions) {
143 actionsList.add(actionInfo.buildAction());
148 public static String longToIp(long ip, long mask) {
149 StringBuilder sb = new StringBuilder(15);
150 Joiner joiner = Joiner.on('.');
152 joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
154 sb.append("/" + mask);
156 return sb.toString();
159 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
161 if (listBucketInfo != null) {
162 BucketsBuilder bucketsBuilder = new BucketsBuilder();
163 List<Bucket> bucketList = new ArrayList<Bucket>();
165 for (BucketInfo bucketInfo : listBucketInfo) {
166 BucketBuilder bucketBuilder = new BucketBuilder();
167 List<Action> actionsList = new ArrayList<Action>();
169 bucketInfo.buildAndAddActions(actionsList);
170 bucketBuilder.setAction(actionsList);
171 bucketBuilder.setWeight(bucketInfo.getWeight());
172 bucketBuilder.setBucketId(new BucketId(i++));
173 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
174 .setWatchGroup(bucketInfo.getWatchGroup());
175 bucketList.add(bucketBuilder.build());
178 bucketsBuilder.setBucket(bucketList);
179 return bucketsBuilder.build();
182 return EMPTY_Buckets;
185 protected static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
186 if (listInstructionInfo != null) {
187 List<Instruction> instructions = new ArrayList<Instruction>();
188 int instructionKey = 0;
190 for (InstructionInfo instructionInfo : listInstructionInfo) {
191 instructions.add(instructionInfo.buildInstruction(instructionKey));
195 return new InstructionsBuilder().setInstruction(instructions).build();
198 return EMPTY_Instructions;
201 protected static Match buildMatches(List<MatchInfo> listMatchInfo) {
202 if (listMatchInfo != null) {
203 MatchBuilder matchBuilder = new MatchBuilder();
204 Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
206 for (MatchInfo matchInfo : listMatchInfo) {
207 matchInfo.createInnerMatchBuilder(mapMatchBuilder);
210 for (MatchInfo matchInfo : listMatchInfo) {
211 matchInfo.setMatch(matchBuilder, mapMatchBuilder);
214 return matchBuilder.build();
217 return EMPTY_Matches;
220 // TODO: Check the port const
221 public static NodeConnectorRef getDefaultNodeConnRef(long nDpId) {
222 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
225 public static NodeConnectorRef getNodeConnRef(long nDpId, String port) {
226 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
229 public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
230 String sNodeConnectorKey;
234 NodeConnectorId nodeConnectorId;
235 NodeConnectorKey nodeConnectorKey;
236 InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
237 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
238 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
239 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
240 NodeConnectorRef nodeConnectorRef;
242 sbTmp = new StringBuilder();
244 sbTmp.append(sNodeId);
245 sbTmp.append(SEPARATOR);
248 sNodeConnectorKey = sbTmp.toString();
249 nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
250 nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
252 nodeId = new NodeId(sNodeId);
253 nodeKey = new NodeKey(nodeId);
255 nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
256 nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
257 nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
258 NodeConnector.class, nodeConnectorKey);
259 nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
260 nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
261 return nodeConnectorRef;
264 public static long getDpnIdFromNodeName(NodeId nodeId) {
265 return getDpnIdFromNodeName(nodeId.getValue());
268 public static long getDpnIdFromNodeName(String sMdsalNodeName) {
269 String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
270 return Long.parseLong(sDpId);
273 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
274 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
277 public static long getOfPortNumberFromPortName(String sMdsalPortName) {
278 String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
279 return Long.parseLong(sPortNumber);