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.flow.types.rev131026.FlowCookie;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
58 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
61 import com.google.common.base.Joiner;
62 import com.google.common.primitives.Bytes;
63 import com.google.common.primitives.Ints;
65 public class MDSALUtil {
67 public static final String NODE_PREFIX = "openflow";
68 public static final String SEPARATOR = ":"; // TODO name separtor correctly
70 private static final Buckets EMPTY_Buckets = new BucketsBuilder().build();
71 private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction(
72 new ArrayList<Instruction>()).build();
73 private static final Match EMPTY_Matches = new MatchBuilder().build();
75 // public static Map<Long, SyncStatus> syncStatusMap = new
76 // ConcurrentHashMap<Long, SyncStatus>();
77 public static Map<Long, LinkedBlockingQueue<Object>> lportMap = new ConcurrentHashMap<Long, LinkedBlockingQueue<Object>>();
78 public static Map<Long, LinkedBlockingQueue<Object>> lportDownMap = new ConcurrentHashMap<Long, LinkedBlockingQueue<Object>>();
79 // public static Map<String, Boolean> ofRefMap = new
80 // ConcurrentHashMap<String, Boolean>();
81 public static Map<Long, Map<String, Boolean>> ofRefMapDpn = new ConcurrentHashMap<Long, Map<String, Boolean>>();
82 public static Map<Long, Map<Integer, String>> ofRefGroupMapDpn = new ConcurrentHashMap<Long, Map<Integer, String>>();
83 public static Map<Long, Map<String, String>> ofRefFlowMapDpn = new ConcurrentHashMap<Long, Map<String, String>>();
85 public static FlowEntity buildFlowEntity(long dpnId, short tableId, String flowId, int priority, String flowName,
86 int idleTimeOut, int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
87 List<InstructionInfo> listInstructionInfo) {
89 FlowEntity flowEntity = new FlowEntity(dpnId);
91 flowEntity.setTableId(tableId);
92 flowEntity.setFlowId(flowId);
93 flowEntity.setPriority(priority);
94 flowEntity.setFlowName(flowName);
95 flowEntity.setIdleTimeOut(idleTimeOut);
96 flowEntity.setHardTimeOut(hardTimeOut);
97 flowEntity.setCookie(cookie);
98 flowEntity.setMatchInfoList(listMatchInfo);
99 flowEntity.setInstructionInfoList(listInstructionInfo);
106 public static Flow buildResyncFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
107 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
108 List<InstructionInfo> listInstructionInfo, boolean isStrict, boolean isResync) {
109 FlowKey key = new FlowKey(new FlowId(flowId));
110 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
111 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
112 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
113 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
114 .setCookie(new FlowCookie(cookie)).setResyncFlag(isResync).build();
117 // TODO: CHECK IF THIS IS USED
118 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
119 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo, List<InstructionInfo> listInstructionInfo) {
120 return MDSALUtil.buildFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie,
121 listMatchInfo, listInstructionInfo, true);
124 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
125 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
126 List<InstructionInfo> listInstructionInfo, boolean isStrict) {
127 FlowKey key = new FlowKey(new FlowId(flowId));
128 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
129 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
130 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
131 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
132 .setCookie(new FlowCookie(cookie)).build();
137 public static Flow buildResyncFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
138 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
139 List<InstructionInfo> listInstructionInfo, boolean isStrict, boolean isResync, boolean isSendFlowRem) {
140 FlowKey key = new FlowKey(new FlowId(flowId));
141 return new FlowBuilder().setMatch(buildMatches(listMatchInfo)).setKey(key)
142 .setPriority(Integer.valueOf(priority)).setInstructions(buildInstructions(listInstructionInfo))
143 .setBarrier(false).setInstallHw(true).setHardTimeout(hardTimeOut).setIdleTimeout(idleTimeOut)
144 .setFlowName(flowName).setTableId(Short.valueOf(tableId)).setStrict(isStrict)
145 .setCookie(new FlowCookie(cookie))
146 .setFlags(new FlowModFlags(false, false, false, false, isSendFlowRem)).setResyncFlag(isResync).build();
151 public static Flow buildFlow(short tableId, String flowId, int priority, String flowName, int idleTimeOut,
152 int hardTimeOut, BigInteger cookie, List<MatchInfo> listMatchInfo,
153 List<InstructionInfo> listInstructionInfo, boolean isStrict, boolean isSendFlowRem) {
154 return buildResyncFlow(tableId, flowId, priority, flowName, idleTimeOut, hardTimeOut, cookie, listMatchInfo,
155 listInstructionInfo, isStrict, false, isSendFlowRem);
161 public static GroupEntity buildGroupEntity(long dpnId, long groupId, String groupName, GroupTypes groupType,
162 List<BucketInfo> listBucketInfo) {
164 GroupEntity groupEntity = new GroupEntity(dpnId);
166 groupEntity.setGroupId(groupId);
167 groupEntity.setGroupName(groupName);
168 groupEntity.setGroupType(groupType);
169 groupEntity.setBucketInfoList(listBucketInfo);
174 // FIXME -- AS ReSync is not required for ODL VPN Service
176 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, List<BucketInfo> listBucketInfo) {
177 return buildGroup(groupId, groupName, groupType, listBucketInfo, false);
180 public static Group buildGroup(long groupId, String groupName, GroupTypes groupType,
181 List<BucketInfo> listBucketInfo, boolean isResync) {
182 return new GroupBuilder().setBuckets(buildBuckets(listBucketInfo)).setKey(new GroupKey(new GroupId(groupId)))
183 .setBarrier(false).setGroupId(new GroupId(Long.valueOf(groupId))).setGroupType(groupType)
184 .setGroupName(groupName).setResyncFlag(isResync).build();
187 public static GetFlowStatisticsFromFlowTableInput buildGetFlowStatisticsFromFlowTableInput(short tableId,
188 List<MatchInfo> listMatchInfo, long dpnId) {
189 return new GetFlowStatisticsFromFlowTableInputBuilder()
190 .setTableId(Short.valueOf(tableId))
191 .setMatch(buildMatches(listMatchInfo))
193 new NodeRef(InstanceIdentifier.builder(Nodes.class)
194 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance())).build();
198 public static GetGroupStatisticsInput buildGetGroupStatistics(long groupId, long dpnId) {
199 return new GetGroupStatisticsInputBuilder()
200 .setGroupId(new GroupId(Long.valueOf(groupId)))
202 new NodeRef(InstanceIdentifier.builder(Nodes.class)
203 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance())).build();
206 public static TransmitPacketInput getPacketOutDefault(List<ActionInfo> actionInfos, byte[] payload, long dpnId) {
207 return new TransmitPacketInputBuilder()
208 .setAction(buildActions(actionInfos))
211 new NodeRef(InstanceIdentifier.builder(Nodes.class)
212 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
213 .setIngress(getDefaultNodeConnRef(dpnId)).setEgress(getDefaultNodeConnRef(dpnId)).build();
216 public static TransmitPacketInput getPacketOut(List<ActionInfo> actionInfos, byte[] payload, long dpnId,
217 NodeConnectorRef ingress) {
218 return new TransmitPacketInputBuilder()
219 .setAction(buildActions(actionInfos))
222 new NodeRef(InstanceIdentifier.builder(Nodes.class)
223 .child(Node.class, new NodeKey(new NodeId("openflow:" + dpnId))).toInstance()))
224 .setIngress(ingress).setEgress(ingress).build();
227 private static List<Action> buildActions(List<ActionInfo> actions) {
228 List<Action> actionsList = new ArrayList<Action>();
229 for (ActionInfo actionInfo : actions) {
230 actionsList.add(actionInfo.buildAction());
235 public static String longToIp(long ip, long mask) {
236 StringBuilder sb = new StringBuilder(15);
237 Joiner joiner = Joiner.on('.');
239 joiner.appendTo(sb, Bytes.asList(Ints.toByteArray((int) ip)));
241 sb.append("/" + mask);
243 return sb.toString();
246 protected static Buckets buildBuckets(List<BucketInfo> listBucketInfo) {
248 if (listBucketInfo != null) {
249 BucketsBuilder bucketsBuilder = new BucketsBuilder();
250 List<Bucket> bucketList = new ArrayList<Bucket>();
252 for (BucketInfo bucketInfo : listBucketInfo) {
253 BucketBuilder bucketBuilder = new BucketBuilder();
254 List<Action> actionsList = new ArrayList<Action>();
256 bucketInfo.buildAndAddActions(actionsList);
257 bucketBuilder.setAction(actionsList);
258 bucketBuilder.setWeight(bucketInfo.getWeight());
259 bucketBuilder.setBucketId(new BucketId(i++));
260 bucketBuilder.setWeight(bucketInfo.getWeight()).setWatchPort(bucketInfo.getWatchPort())
261 .setWatchGroup(bucketInfo.getWatchGroup());
262 bucketList.add(bucketBuilder.build());
265 bucketsBuilder.setBucket(bucketList);
266 return bucketsBuilder.build();
269 return EMPTY_Buckets;
272 protected static Instructions buildInstructions(List<InstructionInfo> listInstructionInfo) {
273 if (listInstructionInfo != null) {
274 List<Instruction> instructions = new ArrayList<Instruction>();
275 int instructionKey = 0;
277 for (InstructionInfo instructionInfo : listInstructionInfo) {
278 instructions.add(instructionInfo.buildInstruction(instructionKey));
282 return new InstructionsBuilder().setInstruction(instructions).build();
285 return EMPTY_Instructions;
288 protected static Match buildMatches(List<MatchInfo> listMatchInfo) {
289 if (listMatchInfo != null) {
290 MatchBuilder matchBuilder = new MatchBuilder();
291 Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
293 for (MatchInfo matchInfo : listMatchInfo) {
294 matchInfo.createInnerMatchBuilder(mapMatchBuilder);
297 for (MatchInfo matchInfo : listMatchInfo) {
298 matchInfo.setMatch(matchBuilder, mapMatchBuilder);
301 return matchBuilder.build();
304 return EMPTY_Matches;
307 // TODO: Check the port const
308 public static NodeConnectorRef getDefaultNodeConnRef(long nDpId) {
309 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, "0xfffffffd");
312 public static NodeConnectorRef getNodeConnRef(long nDpId, String port) {
313 return getNodeConnRef(NODE_PREFIX + SEPARATOR + nDpId, port);
316 public static NodeConnectorRef getNodeConnRef(String sNodeId, String port) {
317 String sNodeConnectorKey;
321 NodeConnectorId nodeConnectorId;
322 NodeConnectorKey nodeConnectorKey;
323 InstanceIdentifierBuilder<Nodes> nodesInstanceIdentifierBuilder;
324 InstanceIdentifierBuilder<Node> nodeInstanceIdentifierBuilder;
325 InstanceIdentifierBuilder<NodeConnector> nodeConnectorInstanceIdentifierBuilder;
326 InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifier;
327 NodeConnectorRef nodeConnectorRef;
329 sbTmp = new StringBuilder();
331 sbTmp.append(sNodeId);
332 sbTmp.append(SEPARATOR);
335 sNodeConnectorKey = sbTmp.toString();
336 nodeConnectorId = new NodeConnectorId(sNodeConnectorKey);
337 nodeConnectorKey = new NodeConnectorKey(nodeConnectorId);
339 nodeId = new NodeId(sNodeId);
340 nodeKey = new NodeKey(nodeId);
342 nodesInstanceIdentifierBuilder = InstanceIdentifier.<Nodes> builder(Nodes.class);
343 nodeInstanceIdentifierBuilder = nodesInstanceIdentifierBuilder.<Node, NodeKey> child(Node.class, nodeKey);
344 nodeConnectorInstanceIdentifierBuilder = nodeInstanceIdentifierBuilder.<NodeConnector, NodeConnectorKey> child(
345 NodeConnector.class, nodeConnectorKey);
346 nodeConnectorInstanceIdentifier = nodeConnectorInstanceIdentifierBuilder.toInstance();
347 nodeConnectorRef = new NodeConnectorRef(nodeConnectorInstanceIdentifier);
348 return nodeConnectorRef;
351 public static long getDpnIdFromNodeName(NodeId nodeId) {
352 return getDpnIdFromNodeName(nodeId.getValue());
355 public static long getDpnIdFromNodeName(String sMdsalNodeName) {
356 String sDpId = sMdsalNodeName.substring(sMdsalNodeName.lastIndexOf(":") + 1);
357 return Long.parseLong(sDpId);
360 public static long getOfPortNumberFromPortName(NodeConnectorId nodeConnectorId) {
361 return getOfPortNumberFromPortName(nodeConnectorId.getValue());
364 public static long getOfPortNumberFromPortName(String sMdsalPortName) {
365 String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
366 return Long.parseLong(sPortNumber);