BUG-1491: handle SET_TP_SRC/SET_TP_DST actions
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / GroupConvertor.java
1 /**
2  * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  *
8  * Contributor: hema.gopalkrishnan@ericsson.com
9  */
10 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
11
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.Iterator;
15 import java.util.List;
16
17 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32  * This Utility class decodes the SAL - Group Mod Message and encodes into a OF
33  * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
34  * Output:GroupModInput Message.
35  *
36  * @param <AddGroupInput>
37  *
38  */
39 public final class GroupConvertor {
40
41     private static final Logger logger = LoggerFactory.getLogger(GroupConvertor.class);
42     private static final String PREFIX_SEPARATOR = "/";
43
44     private static final Integer DEFAULT_WEIGHT = 0;
45     private static final Long OFPP_ANY = Long.parseLong("ffffffff", 16);
46     private static final Long DEFAULT_WATCH_PORT = OFPP_ANY;
47     private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16);
48     private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY;
49
50     private GroupConvertor() {
51
52     }
53
54     public static GroupModInputBuilder toGroupModInput(
55
56     org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) {
57         List<BucketsList> bucketLists = null;
58         GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
59         if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput) {
60             groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
61         } else if (source instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput) {
62             groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
63         } else if (source instanceof UpdatedGroup) {
64             groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
65         }
66         
67         if (source.getGroupType().getIntValue() == 0) {
68             groupModInputBuilder.setType(GroupType.OFPGTALL);
69         }
70
71         if (source.getGroupType().getIntValue() == 1) {
72             groupModInputBuilder.setType(GroupType.OFPGTSELECT);
73         }
74
75         if (source.getGroupType().getIntValue() == 2) {
76             groupModInputBuilder.setType(GroupType.OFPGTINDIRECT);
77         }
78
79         if (source.getGroupType().getIntValue() == 3) {
80             groupModInputBuilder.setType(GroupType.OFPGTFF);
81         }
82
83         groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue()));
84         // Only if the bucket is configured for the group then add it
85         if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) {
86
87             bucketLists = new ArrayList<BucketsList>();
88             getbucketList(source.getBuckets(), bucketLists, version, source.getGroupType().getIntValue(),datapathid);
89             groupModInputBuilder.setBucketsList(bucketLists);
90         }
91         groupModInputBuilder.setVersion(version);
92         return groupModInputBuilder;
93
94     }
95
96     private static void getbucketList(Buckets buckets, List<BucketsList> bucketLists, short version, int groupType,BigInteger datapathid) {
97
98         Iterator<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket> groupBucketIterator = buckets
99                 .getBucket().iterator();
100         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket;
101         
102         while (groupBucketIterator.hasNext()) {
103             groupBucket = groupBucketIterator.next();
104             BucketsListBuilder bucketBuilder = new BucketsListBuilder();
105
106             if ((groupType == GroupType.OFPGTSELECT.getIntValue()) && (groupBucket.getWeight() == null)) {
107
108                 logger.error("Weight value required for this OFPGT_SELECT");
109
110             }
111
112             if (null != groupBucket.getWeight()) {
113                 bucketBuilder.setWeight(groupBucket.getWeight().intValue());
114             } else {
115                 bucketBuilder.setWeight(DEFAULT_WEIGHT);
116             }
117
118             if ((groupType == GroupType.OFPGTFF.getIntValue()) && (groupBucket.getWatchGroup() == null)) {
119
120                 logger.error("WatchGroup required for this OFPGT_FF");
121
122             }
123             
124             if (null != groupBucket.getWatchGroup()) {
125                 bucketBuilder.setWatchGroup(groupBucket.getWatchGroup());
126             } else {
127                 bucketBuilder.setWatchGroup(BinContent.intToUnsignedLong(DEFAULT_WATCH_GROUP.intValue()));
128             }
129
130             if ((groupType == GroupType.OFPGTFF.getIntValue()) && (groupBucket.getWatchPort() == null)) {
131
132                 logger.error("WatchPort required for this OFPGT_FF");
133
134             }
135
136             if (null != groupBucket.getWatchPort()) {
137                 bucketBuilder.setWatchPort(new PortNumber(groupBucket.getWatchPort()));
138             } else {
139                 bucketBuilder.setWatchPort(new PortNumber(BinContent.intToUnsignedLong(DEFAULT_WATCH_PORT.intValue())));
140             }
141
142             List<Action> bucketActionList = ActionConvertor.getActions(groupBucket.getAction(), version,datapathid, null);
143             bucketBuilder.setAction(bucketActionList);
144             BucketsList bucket = bucketBuilder.build();
145             bucketLists.add(bucket);
146         }
147
148     }
149
150 }