sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 1 | /* |
| 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 | */ |
| 16 | package org.onosproject.segmentrouting.web; |
| 17 | |
| 18 | import org.onlab.packet.Ethernet; |
| 19 | import org.onlab.packet.IpPrefix; |
| 20 | import org.onosproject.cli.net.IpProtocol; |
| 21 | import org.onosproject.codec.CodecContext; |
| 22 | import org.onosproject.codec.JsonCodec; |
| 23 | import com.fasterxml.jackson.databind.node.ObjectNode; |
| 24 | import org.onosproject.net.flow.DefaultTrafficSelector; |
| 25 | import org.onosproject.net.flow.TrafficSelector; |
| 26 | import org.onosproject.net.flow.criteria.Criterion; |
| 27 | import org.onosproject.net.flow.criteria.IPCriterion; |
| 28 | import org.onosproject.net.flow.criteria.IPProtocolCriterion; |
sangho | f9d0bf1 | 2015-05-19 11:57:42 -0700 | [diff] [blame^] | 29 | import org.onosproject.net.flow.criteria.TcpPortCriterion; |
| 30 | import org.onosproject.net.flow.criteria.UdpPortCriterion; |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 31 | import org.onosproject.segmentrouting.Policy; |
| 32 | import org.onosproject.segmentrouting.TunnelPolicy; |
| 33 | |
| 34 | public 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"; |
sangho | f9d0bf1 | 2015-05-19 11:57:42 -0700 | [diff] [blame^] | 44 | private static final String SRC_PORT = "src_tp_port"; |
| 45 | private static final String DST_PORT = "dst_tp_port"; |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 46 | |
| 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); |
sangho | f9d0bf1 | 2015-05-19 11:57:42 -0700 | [diff] [blame^] | 68 | 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); |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 91 | 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(); |
sangho | f9d0bf1 | 2015-05-19 11:57:42 -0700 | [diff] [blame^] | 111 | short srcPort = json.path(SRC_PORT).shortValue(); |
| 112 | short dstPort = json.path(DST_PORT).shortValue(); |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 113 | |
| 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()); |
sangho | f9d0bf1 | 2015-05-19 11:57:42 -0700 | [diff] [blame^] | 126 | 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 | } |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 141 | } |
sangho | 1e57565 | 2015-05-14 00:39:53 -0700 | [diff] [blame] | 142 | 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 | } |