blob: 7e1ab3dbc720dffdc0104308f31de00911f14c95 [file] [log] [blame]
Jian Li77d6e752017-01-29 23:24:18 +09001/*
2 * Copyright 2017-present 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.provider.lisp.mapping.util;
17
Jian Lib8436bb2017-02-23 03:39:08 +090018import com.google.common.collect.Lists;
Jian Lib8436bb2017-02-23 03:39:08 +090019import org.onosproject.lisp.msg.protocols.LispLocator;
20import org.onosproject.lisp.msg.protocols.LispMapRecord;
21import org.onosproject.lisp.msg.types.LispAfiAddress;
Jian Lib8436bb2017-02-23 03:39:08 +090022import org.onosproject.mapping.DefaultMapping;
23import org.onosproject.mapping.DefaultMappingEntry;
24import org.onosproject.mapping.DefaultMappingKey;
25import org.onosproject.mapping.DefaultMappingTreatment;
26import org.onosproject.mapping.DefaultMappingValue;
27import org.onosproject.mapping.Mapping;
Jian Li77d6e752017-01-29 23:24:18 +090028import org.onosproject.mapping.MappingEntry;
Jian Lib8436bb2017-02-23 03:39:08 +090029import org.onosproject.mapping.MappingEntry.MappingEntryState;
30import org.onosproject.mapping.MappingKey;
31import org.onosproject.mapping.MappingTreatment;
32import org.onosproject.mapping.MappingValue;
33import org.onosproject.mapping.actions.MappingAction;
34import org.onosproject.mapping.actions.MappingActions;
35import org.onosproject.mapping.addresses.MappingAddress;
Jian Li77d6e752017-01-29 23:24:18 +090036import org.onosproject.net.DeviceId;
Jian Lie5aa5df2017-04-02 22:40:56 +090037import org.onosproject.net.device.DeviceService;
Jian Li77d6e752017-01-29 23:24:18 +090038import org.slf4j.Logger;
39import org.slf4j.LoggerFactory;
40
Jian Lib8436bb2017-02-23 03:39:08 +090041import java.util.List;
Jian Lib8436bb2017-02-23 03:39:08 +090042
Jian Li55648ed2017-05-01 02:20:55 +090043import static org.onosproject.provider.lisp.mapping.util.MappingAddressBuilder.getAddress;
Jian Lie5aa5df2017-04-02 22:40:56 +090044
Jian Li77d6e752017-01-29 23:24:18 +090045/**
46 * Mapping entry builder class.
47 */
48public class MappingEntryBuilder {
Jian Lib8436bb2017-02-23 03:39:08 +090049 private static final Logger log =
Jian Lie5aa5df2017-04-02 22:40:56 +090050 LoggerFactory.getLogger(MappingEntryBuilder.class);
Jian Lib8436bb2017-02-23 03:39:08 +090051
Jian Li77d6e752017-01-29 23:24:18 +090052 private final DeviceId deviceId;
Jian Lib8436bb2017-02-23 03:39:08 +090053
54 private final MappingAddress address;
55 private final MappingAction action;
56 private final List<MappingTreatment> treatments;
Jian Li77d6e752017-01-29 23:24:18 +090057
Jian Lie5aa5df2017-04-02 22:40:56 +090058 private final DeviceService deviceService;
59
Jian Li77d6e752017-01-29 23:24:18 +090060 /**
61 * Default constructor for MappingEntryBuilder.
62 *
Jian Lie5aa5df2017-04-02 22:40:56 +090063 * @param deviceId device identifier
64 * @param record LISP map record
65 * @param deviceService device service
66 */
67 public MappingEntryBuilder(DeviceId deviceId, LispMapRecord record,
68 DeviceService deviceService) {
69 this.deviceId = deviceId;
70 this.address = buildAddress(record);
71 this.action = buildAction(record);
72 this.treatments = buildTreatments(record);
73 this.deviceService = deviceService;
74 }
75
76 /**
77 * Default constructor for MappingEntryBuilder.
78 *
79 * @param deviceId device identifier
80 * @param record LISP map record
Jian Li77d6e752017-01-29 23:24:18 +090081 */
Jian Lib8436bb2017-02-23 03:39:08 +090082 public MappingEntryBuilder(DeviceId deviceId, LispMapRecord record) {
Jian Li77d6e752017-01-29 23:24:18 +090083 this.deviceId = deviceId;
Jian Lib8436bb2017-02-23 03:39:08 +090084 this.address = buildAddress(record);
85 this.action = buildAction(record);
86 this.treatments = buildTreatments(record);
Jian Lie5aa5df2017-04-02 22:40:56 +090087 this.deviceService = null;
Jian Li77d6e752017-01-29 23:24:18 +090088 }
89
90 /**
Jian Lib8436bb2017-02-23 03:39:08 +090091 * Builds mapping entry from a specific LISP control message.
Jian Li77d6e752017-01-29 23:24:18 +090092 *
Jian Lib8436bb2017-02-23 03:39:08 +090093 * @return mapping entry
Jian Li77d6e752017-01-29 23:24:18 +090094 */
Jian Lib8436bb2017-02-23 03:39:08 +090095 public MappingEntry build() {
96 Mapping.Builder builder;
97
Jian Lib8436bb2017-02-23 03:39:08 +090098 builder = DefaultMapping.builder()
Jian Lided80012017-04-24 22:13:22 +090099 .withId(buildKey().hashCode())
Jian Lib8436bb2017-02-23 03:39:08 +0900100 .forDevice(deviceId)
101 .withKey(buildKey())
102 .withValue(buildValue());
103
104 // TODO: we assume that the mapping entry will be always
105 // stored in routers without failure for now, which means
106 // the mapping entry state will always be ADDED rather than
107 // PENDING_ADD
108 // we will revisit this part when LISP driver is finished
109 return new DefaultMappingEntry(builder.build(), MappingEntryState.ADDED);
Jian Li77d6e752017-01-29 23:24:18 +0900110 }
111
Jian Lib8436bb2017-02-23 03:39:08 +0900112 /**
113 * Builds mapping key.
114 *
115 * @return mapping key
116 */
117 private MappingKey buildKey() {
118
119 MappingKey.Builder builder = DefaultMappingKey.builder();
120
121 builder.withAddress(address);
122
123 return builder.build();
124 }
125
126 /**
127 * Builds mapping value.
128 *
129 * @return mapping value
130 */
131 private MappingValue buildValue() {
132
133 MappingValue.Builder builder = DefaultMappingValue.builder();
134 builder.withAction(action);
135
136 treatments.forEach(builder::add);
137
138 return builder.build();
139 }
140
141 /**
142 * Builds mapping action.
143 *
144 * @param record LISP map record
145 * @return mapping action
146 */
147 private MappingAction buildAction(LispMapRecord record) {
148
149 if (record == null) {
150 return MappingActions.noAction();
151 }
152
153 switch (record.getAction()) {
154 case NoAction:
155 return MappingActions.noAction();
156 case SendMapRequest:
157 return MappingActions.forward();
158 case NativelyForward:
159 return MappingActions.nativeForward();
160 case Drop:
161 return MappingActions.drop();
162 default:
163 log.warn("Unsupported action type {}", record.getAction());
164 return MappingActions.noAction();
165 }
166 }
167
168 /**
169 * Builds mapping address.
170 *
171 * @param record LISP map record
172 * @return mapping address
173 */
174 private MappingAddress buildAddress(LispMapRecord record) {
175
Jian Li55648ed2017-05-01 02:20:55 +0900176 return record == null ? null :
177 getAddress(deviceService, deviceId, record.getEidPrefixAfi());
Jian Li0f0d7482017-03-20 15:16:13 +0900178 }
179
180 /**
Jian Lib8436bb2017-02-23 03:39:08 +0900181 * Builds a collection of mapping treatments.
182 *
183 * @param record LISP map record
184 * @return a collection of mapping treatments
185 */
186 private List<MappingTreatment> buildTreatments(LispMapRecord record) {
187
188 List<LispLocator> locators = record.getLocators();
189 List<MappingTreatment> treatments = Lists.newArrayList();
190 for (LispLocator locator : locators) {
191 MappingTreatment.Builder builder = DefaultMappingTreatment.builder();
192 LispAfiAddress address = locator.getLocatorAfi();
Jian Lib8436bb2017-02-23 03:39:08 +0900193
Jian Li55648ed2017-05-01 02:20:55 +0900194 final MappingAddress mappingAddress =
195 getAddress(deviceService, deviceId, address);
Jian Lib8436bb2017-02-23 03:39:08 +0900196 if (mappingAddress != null) {
197 builder.withAddress(mappingAddress);
198 }
199
200 builder.setUnicastWeight(locator.getWeight())
201 .setUnicastPriority(locator.getPriority())
202 .setMulticastWeight(locator.getMulticastWeight())
203 .setMulticastPriority(locator.getMulticastPriority());
204
205 // TODO: need to convert specific properties to
206 // abstracted extension properties
207
208 treatments.add(builder.build());
209 }
210
211 return treatments;
212 }
Jian Li77d6e752017-01-29 23:24:18 +0900213}