blob: 3e2524d1045f96789a1d80f00968a7bd683e3c15 [file] [log] [blame]
sangho27462c62015-05-14 00:39:53 -07001/*
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.segmentrouting.web;
17
18import org.onlab.packet.Ethernet;
19import org.onlab.packet.IpPrefix;
20import org.onosproject.cli.net.IpProtocol;
21import org.onosproject.codec.CodecContext;
22import org.onosproject.codec.JsonCodec;
23import com.fasterxml.jackson.databind.node.ObjectNode;
24import org.onosproject.net.flow.DefaultTrafficSelector;
25import org.onosproject.net.flow.TrafficSelector;
26import org.onosproject.net.flow.criteria.Criterion;
27import org.onosproject.net.flow.criteria.IPCriterion;
28import org.onosproject.net.flow.criteria.IPProtocolCriterion;
sangho80f1f892015-05-19 11:57:42 -070029import org.onosproject.net.flow.criteria.TcpPortCriterion;
30import org.onosproject.net.flow.criteria.UdpPortCriterion;
sangho27462c62015-05-14 00:39:53 -070031import org.onosproject.segmentrouting.Policy;
32import org.onosproject.segmentrouting.TunnelPolicy;
33
34public final class PolicyCodec extends JsonCodec<Policy> {
35
36 // JSON field names
37 private static final String POLICY_ID = "policy_id";
38 private static final String PRIORITY = "priority";
39 private static final String TYPE = "policy_type";
40 private static final String TUNNEL_ID = "tunnel_id";
41 private static final String DST_IP = "dst_ip";
42 private static final String SRC_IP = "src_ip";
43 private static final String PROTO_TYPE = "proto_type";
sangho80f1f892015-05-19 11:57:42 -070044 private static final String SRC_PORT = "src_tp_port";
45 private static final String DST_PORT = "dst_tp_port";
sangho27462c62015-05-14 00:39:53 -070046
47 @Override
48 public ObjectNode encode(Policy policy, CodecContext context) {
49 final ObjectNode result = context.mapper().createObjectNode()
50 .put(POLICY_ID, policy.id());
51
52 result.put(PRIORITY, policy.priority());
53 result.put(TYPE, policy.type().toString());
54
55 if (policy.selector().getCriterion(Criterion.Type.IPV4_DST) != null) {
56 IPCriterion criterion = (IPCriterion) policy.selector().getCriterion(
57 Criterion.Type.IPV4_DST);
58 result.put(DST_IP, criterion.ip().toString());
59 }
60 if (policy.selector().getCriterion(Criterion.Type.IPV4_SRC) != null) {
61 IPCriterion criterion = (IPCriterion) policy.selector().getCriterion(
62 Criterion.Type.IPV4_SRC);
63 result.put(SRC_IP, criterion.ip().toString());
64 }
65 if (policy.selector().getCriterion(Criterion.Type.IP_PROTO) != null) {
66 IPProtocolCriterion protocolCriterion =
67 (IPProtocolCriterion) policy.selector().getCriterion(Criterion.Type.IP_PROTO);
sangho80f1f892015-05-19 11:57:42 -070068 result.put(PROTO_TYPE, protocolCriterion.protocol());
69 }
70 if (policy.selector().getCriterion(Criterion.Type.TCP_SRC) != null) {
71 TcpPortCriterion tcpPortCriterion =
72 (TcpPortCriterion) policy.selector().getCriterion(Criterion.Type.TCP_SRC);
73 result.put(SRC_PORT, tcpPortCriterion.toString());
74 } else if (policy.selector().getCriterion(Criterion.Type.UDP_SRC) != null) {
75 UdpPortCriterion udpPortCriterion =
76 (UdpPortCriterion) policy.selector().getCriterion(Criterion.Type.UDP_SRC);
77 result.put(SRC_PORT, udpPortCriterion.toString());
78 }
79 if (policy.selector().getCriterion(Criterion.Type.TCP_DST) != null) {
80 TcpPortCriterion tcpPortCriterion =
81 (TcpPortCriterion) policy.selector().getCriterion(Criterion.Type.TCP_DST);
82 result.put(DST_PORT, tcpPortCriterion.toString());
83 } else if (policy.selector().getCriterion(Criterion.Type.UDP_DST) != null) {
84 UdpPortCriterion udpPortCriterion =
85 (UdpPortCriterion) policy.selector().getCriterion(Criterion.Type.UDP_DST);
86 result.put(DST_PORT, udpPortCriterion.toString());
87 }
88 if (policy.selector().getCriterion(Criterion.Type.IP_PROTO) != null) {
89 IPProtocolCriterion protocolCriterion =
90 (IPProtocolCriterion) policy.selector().getCriterion(Criterion.Type.IP_PROTO);
sangho27462c62015-05-14 00:39:53 -070091 result.put(PROTO_TYPE, protocolCriterion.toString());
92 }
93
94 if (policy.type() == Policy.Type.TUNNEL_FLOW) {
95 result.put(TUNNEL_ID, ((TunnelPolicy) policy).tunnelId());
96 }
97
98 return result;
99 }
100
101 @Override
102 public Policy decode(ObjectNode json, CodecContext context) {
103
104 String pid = json.path(POLICY_ID).asText();
105 String type = json.path(TYPE).asText();
106 int priority = json.path(PRIORITY).asInt();
107 String dstIp = json.path(DST_IP).asText();
108 String srcIp = json.path(SRC_IP).asText();
109 String tunnelId = json.path(TUNNEL_ID).asText();
110 String protoType = json.path(PROTO_TYPE).asText();
sangho80f1f892015-05-19 11:57:42 -0700111 short srcPort = json.path(SRC_PORT).shortValue();
112 short dstPort = json.path(DST_PORT).shortValue();
sangho27462c62015-05-14 00:39:53 -0700113
114 if (tunnelId != null) {
115 TrafficSelector.Builder tsb = DefaultTrafficSelector.builder();
116 tsb.matchEthType(Ethernet.TYPE_IPV4);
117 if (dstIp != null && !dstIp.isEmpty()) {
118 tsb.matchIPDst(IpPrefix.valueOf(dstIp));
119 }
120 if (srcIp != null && !srcIp.isEmpty()) {
121 tsb.matchIPSrc(IpPrefix.valueOf(srcIp));
122 }
123 if (protoType != null && !protoType.isEmpty()) {
124 Short ipProto = Short.valueOf(IpProtocol.valueOf(protoType).value());
125 tsb.matchIPProtocol(ipProto.byteValue());
sangho80f1f892015-05-19 11:57:42 -0700126 if (IpProtocol.valueOf(protoType).equals(IpProtocol.TCP)) {
127 if (srcPort != 0) {
128 tsb.matchTcpSrc(srcPort);
129 }
130 if (dstPort != 0) {
131 tsb.matchTcpDst(dstPort);
132 }
133 } else if (IpProtocol.valueOf(protoType).equals(IpProtocol.UDP)) {
134 if (srcPort != 0) {
135 tsb.matchUdpSrc(srcPort);
136 }
137 if (dstPort != 0) {
138 tsb.matchUdpDst(dstPort);
139 }
140 }
sangho27462c62015-05-14 00:39:53 -0700141 }
sangho27462c62015-05-14 00:39:53 -0700142 TunnelPolicy.Builder tpb = TunnelPolicy.builder().setPolicyId(pid);
143 if (tunnelId != null) {
144 tpb.setTunnelId(tunnelId);
145 }
146 if (!json.path(PRIORITY).isMissingNode()) {
147 tpb.setPriority(priority);
148 }
149 if (!json.path(TYPE).isMissingNode()) {
150 tpb.setType(Policy.Type.valueOf(type));
151 }
152 tpb.setSelector(tsb.build());
153
154 return tpb.build();
155 } else {
156 // TODO: handle more policy types
157 return null;
158 }
159
160
161 }
162
163}