blob: 3c6d4d7b6c637a82ab70793e83c0bd0ace2a7ffb [file] [log] [blame]
Ray Milkeyc95bb9d2015-01-06 10:28:24 -08001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.codec.impl;
17
18import org.onosproject.codec.CodecContext;
19import org.onosproject.codec.JsonCodec;
20import org.onosproject.net.flow.criteria.Criteria;
21import org.onosproject.net.flow.criteria.Criterion;
22import org.slf4j.Logger;
23import org.slf4j.LoggerFactory;
24
25import com.fasterxml.jackson.databind.node.ObjectNode;
26
27import static com.google.common.base.Preconditions.checkNotNull;
28
29/**
30 * Criterion codec.
31 */
Ray Milkey540b2ce2015-02-04 17:50:20 -080032public final class CriterionCodec extends JsonCodec<Criterion> {
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080033
34 protected static final Logger log = LoggerFactory.getLogger(CriterionCodec.class);
35
36 @Override
37 public ObjectNode encode(Criterion criterion, CodecContext context) {
38 checkNotNull(criterion, "Criterion cannot be null");
39
40 final ObjectNode result = context.mapper().createObjectNode()
41 .put("type", criterion.type().toString());
42
43 switch (criterion.type()) {
44
45 case IN_PORT:
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -080046 case IN_PHY_PORT:
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080047 final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion;
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080048 result.put("port", portCriterion.port().toLong());
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080049 break;
50
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -080051 case METADATA:
52 final Criteria.MetadataCriterion metadataCriterion =
53 (Criteria.MetadataCriterion) criterion;
54 result.put("metadata", metadataCriterion.metadata());
55 break;
56
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080057 case ETH_DST:
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080058 case ETH_SRC:
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080059 final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion;
Ray Milkeydb358082015-01-13 16:34:38 -080060 result.put("mac", ethCriterion.mac().toString());
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080061 break;
62
63 case ETH_TYPE:
64 final Criteria.EthTypeCriterion ethTypeCriterion =
65 (Criteria.EthTypeCriterion) criterion;
66 result.put("ethType", ethTypeCriterion.ethType());
67 break;
68
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080069 case VLAN_VID:
70 final Criteria.VlanIdCriterion vlanIdCriterion =
71 (Criteria.VlanIdCriterion) criterion;
72 result.put("vlanId", vlanIdCriterion.vlanId().toShort());
Ray Milkeyc95bb9d2015-01-06 10:28:24 -080073 break;
74
75 case VLAN_PCP:
76 final Criteria.VlanPcpCriterion vlanPcpCriterion =
77 (Criteria.VlanPcpCriterion) criterion;
78 result.put("priority", vlanPcpCriterion.priority());
79 break;
80
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -080081 case IP_DSCP:
82 final Criteria.IPDscpCriterion ipDscpCriterion =
83 (Criteria.IPDscpCriterion) criterion;
84 result.put("ipDscp", ipDscpCriterion.ipDscp());
85 break;
86
87 case IP_ECN:
88 final Criteria.IPEcnCriterion ipEcnCriterion =
89 (Criteria.IPEcnCriterion) criterion;
90 result.put("ipEcn", ipEcnCriterion.ipEcn());
91 break;
92
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080093 case IP_PROTO:
94 final Criteria.IPProtocolCriterion iPProtocolCriterion =
95 (Criteria.IPProtocolCriterion) criterion;
96 result.put("protocol", iPProtocolCriterion.protocol());
97 break;
98
99 case IPV4_SRC:
100 case IPV4_DST:
101 case IPV6_SRC:
102 case IPV6_DST:
103 final Criteria.IPCriterion iPCriterion = (Criteria.IPCriterion) criterion;
104 result.put("ip", iPCriterion.ip().toString());
Ray Milkeyc95bb9d2015-01-06 10:28:24 -0800105 break;
106
107 case TCP_SRC:
108 case TCP_DST:
109 final Criteria.TcpPortCriterion tcpPortCriterion =
110 (Criteria.TcpPortCriterion) criterion;
111 result.put("tcpPort", tcpPortCriterion.tcpPort().byteValue());
112 break;
113
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800114 case UDP_SRC:
115 case UDP_DST:
116 final Criteria.UdpPortCriterion udpPortCriterion =
117 (Criteria.UdpPortCriterion) criterion;
118 result.put("udpPort", udpPortCriterion.udpPort().byteValue());
119 break;
120
121 case SCTP_SRC:
122 case SCTP_DST:
123 final Criteria.SctpPortCriterion sctpPortCriterion =
124 (Criteria.SctpPortCriterion) criterion;
125 result.put("sctpPort",
126 sctpPortCriterion.sctpPort().byteValue());
127 break;
128
129 case ICMPV4_TYPE:
130 final Criteria.IcmpTypeCriterion icmpTypeCriterion =
131 (Criteria.IcmpTypeCriterion) criterion;
132 result.put("icmpType", icmpTypeCriterion.icmpType());
133 break;
134
135 case ICMPV4_CODE:
136 final Criteria.IcmpCodeCriterion icmpCodeCriterion =
137 (Criteria.IcmpCodeCriterion) criterion;
138 result.put("icmpCode", icmpCodeCriterion.icmpCode());
139 break;
140
141 case IPV6_FLABEL:
142 final Criteria.IPv6FlowLabelCriterion ipv6FlowLabelCriterion =
143 (Criteria.IPv6FlowLabelCriterion) criterion;
144 result.put("flowLabel",
145 ipv6FlowLabelCriterion.flowLabel());
146 break;
147
148 case ICMPV6_TYPE:
149 final Criteria.Icmpv6TypeCriterion icmpv6TypeCriterion =
150 (Criteria.Icmpv6TypeCriterion) criterion;
151 result.put("icmpv6Type", icmpv6TypeCriterion.icmpv6Type());
152 break;
153
154 case ICMPV6_CODE:
155 final Criteria.Icmpv6CodeCriterion icmpv6CodeCriterion =
156 (Criteria.Icmpv6CodeCriterion) criterion;
157 result.put("icmpv6Code", icmpv6CodeCriterion.icmpv6Code());
158 break;
159
160 case IPV6_ND_TARGET:
161 final Criteria.IPv6NDTargetAddressCriterion ipv6NDTargetAddressCriterion
162 = (Criteria.IPv6NDTargetAddressCriterion) criterion;
163 result.put("targetAddress",
164 ipv6NDTargetAddressCriterion.targetAddress().toString());
165 break;
166
167 case IPV6_ND_SLL:
168 case IPV6_ND_TLL:
169 final Criteria.IPv6NDLinkLayerAddressCriterion ipv6NDLinkLayerAddressCriterion
170 = (Criteria.IPv6NDLinkLayerAddressCriterion) criterion;
171 result.put("mac",
172 ipv6NDLinkLayerAddressCriterion.mac().toString());
173 break;
174
Ray Milkeyc95bb9d2015-01-06 10:28:24 -0800175 case MPLS_LABEL:
176 final Criteria.MplsCriterion mplsCriterion =
177 (Criteria.MplsCriterion) criterion;
178 result.put("label", mplsCriterion.label());
179 break;
180
181 case OCH_SIGID:
182 final Criteria.LambdaCriterion lambdaCriterion =
183 (Criteria.LambdaCriterion) criterion;
184 result.put("lambda", lambdaCriterion.lambda());
185 break;
186
187 case OCH_SIGTYPE:
188 final Criteria.OpticalSignalTypeCriterion opticalSignalTypeCriterion =
189 (Criteria.OpticalSignalTypeCriterion) criterion;
190 result.put("signalType", opticalSignalTypeCriterion.signalType());
191 break;
192
193 default:
194 // Don't know how to format this type
195 log.info("Cannot convert criterion of type {} to JSON",
196 criterion.type());
197 break;
198 }
199
200 return result;
201 }
202}