blob: a0480aac3932799fa4bd3b4bc114c6513da218f8 [file] [log] [blame]
Jian Li3ff327a2017-03-14 17:02:19 +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 */
16
17package org.onosproject.drivers.lisp.extensions;
18
Jian Li299bc1d2017-03-17 19:17:40 +090019import com.google.common.collect.Maps;
20import org.onlab.util.KryoNamespace;
21import org.onosproject.mapping.addresses.ASMappingAddress;
22import org.onosproject.mapping.addresses.DNMappingAddress;
23import org.onosproject.mapping.addresses.EthMappingAddress;
Jian Li3ff327a2017-03-14 17:02:19 +090024import org.onosproject.mapping.addresses.ExtensionMappingAddress;
25import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
Jian Li299bc1d2017-03-17 19:17:40 +090026import org.onosproject.mapping.addresses.IPMappingAddress;
27import org.onosproject.mapping.addresses.MappingAddress;
Jian Li3ff327a2017-03-14 17:02:19 +090028import org.onosproject.net.flow.AbstractExtension;
Jian Li299bc1d2017-03-17 19:17:40 +090029import org.onosproject.store.serializers.KryoNamespaces;
30
31import java.util.Map;
32import java.util.Objects;
33
34import static com.google.common.base.MoreObjects.toStringHelper;
35import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
36 .ExtensionMappingAddressTypes.AS_ADDRESS;
Jian Li3ff327a2017-03-14 17:02:19 +090037
38/**
39 * Implementation of LISP Autonomous System (AS) address.
Jian Li299bc1d2017-03-17 19:17:40 +090040 * When an AS number is stored in the LISP Mapping Database System for either
41 * policy or documentation reasons, it can be encoded in a LISP Canonical Address.
Jian Li3ff327a2017-03-14 17:02:19 +090042 */
Jian Li299bc1d2017-03-17 19:17:40 +090043public final class LispAsAddress extends AbstractExtension
Jian Li3ff327a2017-03-14 17:02:19 +090044 implements ExtensionMappingAddress {
Jian Li299bc1d2017-03-17 19:17:40 +090045
46 private static final String AS_NUMBER = "asNumber";
47 private static final String ADDRESS = "address";
48
49 private int asNumber;
50 private MappingAddress address;
51
52 private final KryoNamespace appKryo = new KryoNamespace.Builder()
53 .register(KryoNamespaces.API)
54 .register(MappingAddress.class)
55 .register(MappingAddress.Type.class)
56 .register(IPMappingAddress.class)
57 .register(ASMappingAddress.class)
58 .register(DNMappingAddress.class)
59 .register(EthMappingAddress.class)
60 .build();
61
62 /**
63 * Default constructor.
64 */
65 public LispAsAddress() {
66 }
67
68 /**
69 * Creates an instance with initialized parameters.
70 *
71 * @param asNumber AS number
72 */
73 private LispAsAddress(int asNumber, MappingAddress address) {
74 this.asNumber = asNumber;
75 this.address = address;
76 }
77
78 /**
79 * Obtains AS number.
80 *
81 * @return AS number
82 */
83 public int getAsNumber() {
84 return asNumber;
85 }
86
87 /**
88 * Obtains mapping address.
89 *
90 * @return mapping address
91 */
92 public MappingAddress getAddress() {
93 return address;
94 }
95
Jian Li3ff327a2017-03-14 17:02:19 +090096 @Override
97 public ExtensionMappingAddressType type() {
Jian Li299bc1d2017-03-17 19:17:40 +090098 return AS_ADDRESS.type();
Jian Li3ff327a2017-03-14 17:02:19 +090099 }
100
101 @Override
102 public byte[] serialize() {
Jian Li299bc1d2017-03-17 19:17:40 +0900103 Map<String, Object> parameterMap = Maps.newHashMap();
104
105 parameterMap.put(AS_NUMBER, asNumber);
106 parameterMap.put(ADDRESS, address);
107 return appKryo.serialize(parameterMap);
Jian Li3ff327a2017-03-14 17:02:19 +0900108 }
109
110 @Override
111 public void deserialize(byte[] data) {
Jian Li299bc1d2017-03-17 19:17:40 +0900112 Map<String, Object> parameterMap = appKryo.deserialize(data);
Jian Li3ff327a2017-03-14 17:02:19 +0900113
Jian Li299bc1d2017-03-17 19:17:40 +0900114 this.asNumber = (int) parameterMap.get(AS_NUMBER);
115 this.address = (MappingAddress) parameterMap.get(ADDRESS);
116 }
117
118 @Override
119 public int hashCode() {
120 return Objects.hash(asNumber, address);
121 }
122
123 @Override
124 public boolean equals(Object obj) {
125 if (this == obj) {
126 return true;
127 }
128
129 if (obj instanceof LispAsAddress) {
130 final LispAsAddress other = (LispAsAddress) obj;
131 return Objects.equals(asNumber, other.asNumber) &&
132 Objects.equals(address, other.address);
133 }
134
135 return false;
136 }
137
138 @Override
139 public String toString() {
140 return toStringHelper(this)
141 .add("AS number", asNumber)
142 .add("address", address)
143 .toString();
144 }
145
146 /**
147 * A builder for building LispAsAddress.
148 */
149 public static final class Builder {
150 private int asNumber;
151 private MappingAddress address;
152
153 /**
154 * Sets AS number.
155 *
156 * @param asNumber AS number
157 * @return Builder object
158 */
159 public Builder withAsNumber(int asNumber) {
160 this.asNumber = asNumber;
161 return this;
162 }
163
164 /**
165 * Sets mapping address.
166 *
167 * @param address mapping address
168 * @return Builder object
169 */
170 public Builder withAddress(MappingAddress address) {
171 this.address = address;
172 return this;
173 }
174
175 /**
176 * Builds LispAsAddress instance.
177 *
178 * @return LispAsAddress instance
179 */
180 public LispAsAddress build() {
181
182 return new LispAsAddress(asNumber, address);
183 }
Jian Li3ff327a2017-03-14 17:02:19 +0900184 }
185}