blob: 065b0e5c753145659d1402dd044517eafabc485b [file] [log] [blame]
Jian Li6b77dc02016-07-14 16:04:25 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Jian Li6b77dc02016-07-14 16:04:25 +09003 *
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.lisp.msg.types;
17
Jian Lia7b394d2016-08-21 23:11:46 +090018import io.netty.buffer.ByteBuf;
19import org.onosproject.lisp.msg.exceptions.LispParseError;
20import org.onosproject.lisp.msg.exceptions.LispReaderException;
GUNiba871702016-08-22 21:06:02 +090021import org.onosproject.lisp.msg.exceptions.LispWriterException;
Jian Lif31019a2017-02-05 07:57:46 +090022import org.onosproject.lisp.msg.types.lcaf.LispLcafAddress;
Jian Lia7b394d2016-08-21 23:11:46 +090023
Jian Lid56f97e2016-07-19 15:48:15 +090024import java.util.Objects;
25
Jian Li5e505c62016-12-05 02:44:24 +090026import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.IP4;
27import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.IP6;
28import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.NO_ADDRESS;
29import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.DISTINGUISHED_NAME;
30import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.MAC;
31import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.LCAF;
32import static org.onosproject.lisp.msg.types.AddressFamilyIdentifierEnum.AS;
Jian Lia7b394d2016-08-21 23:11:46 +090033
Jian Li6b77dc02016-07-14 16:04:25 +090034/**
35 * LISP Locator address typed by Address Family Identifier (AFI).
36 */
37public abstract class LispAfiAddress {
38
39 private final AddressFamilyIdentifierEnum afi;
40
41 /**
42 * Initializes AFI enumeration value.
43 *
44 * @param afi address family identifier
45 */
46 protected LispAfiAddress(AddressFamilyIdentifierEnum afi) {
47 this.afi = afi;
48 }
49
50 /**
51 * Obtains AFI enumeration value.
52 *
53 * @return AFI enumeration value
54 */
55 public AddressFamilyIdentifierEnum getAfi() {
56 return afi;
57 }
58
59 @Override
60 public int hashCode() {
Jian Lid56f97e2016-07-19 15:48:15 +090061 return Objects.hash(afi);
Jian Li6b77dc02016-07-14 16:04:25 +090062 }
63
64 @Override
65 public boolean equals(Object obj) {
66 if (this == obj) {
67 return true;
68 }
69
70 if (obj == null) {
71 return false;
72 }
73
74 if (getClass() != obj.getClass()) {
75 return false;
76 }
77
78 LispAfiAddress other = (LispAfiAddress) obj;
Jian Lif25adf02017-05-23 14:54:24 +090079 return afi == other.afi;
Jian Li6b77dc02016-07-14 16:04:25 +090080 }
Jian Lia7b394d2016-08-21 23:11:46 +090081
GUNiba871702016-08-22 21:06:02 +090082 /**
83 * AFI address reader class.
84 */
Jian Lia7b394d2016-08-21 23:11:46 +090085 public static class AfiAddressReader implements LispAddressReader<LispAfiAddress> {
86
87 @Override
88 public LispAfiAddress readFrom(ByteBuf byteBuf)
89 throws LispParseError, LispReaderException {
90
91 int index = byteBuf.readerIndex();
92
93 // AFI code -> 16 bits
94 short afiCode = (short) byteBuf.getUnsignedShort(index);
95
Jian Lif11594a2016-10-31 18:16:02 +090096 // handle no address
97 if (afiCode == NO_ADDRESS.getIanaCode()) {
98 byteBuf.readUnsignedShort();
Jian Li6ef1b3f2016-11-12 18:16:06 +090099 return new LispNoAddress.NoAddressReader().readFrom(byteBuf);
Jian Lif11594a2016-10-31 18:16:02 +0900100 }
101
Jian Lia7b394d2016-08-21 23:11:46 +0900102 // handle IPv4 and IPv6 address
Jian Lid4e63702016-08-30 18:29:20 +0900103 if (afiCode == IP4.getIanaCode() ||
Jian Lia7b394d2016-08-21 23:11:46 +0900104 afiCode == IP6.getIanaCode()) {
105 return new LispIpAddress.IpAddressReader().readFrom(byteBuf);
106 }
107
108 // handle distinguished name address
109 if (afiCode == DISTINGUISHED_NAME.getIanaCode()) {
110 return new LispDistinguishedNameAddress.DistinguishedNameAddressReader().readFrom(byteBuf);
111 }
112
113 // handle MAC address
114 if (afiCode == MAC.getIanaCode()) {
115 return new LispMacAddress.MacAddressReader().readFrom(byteBuf);
116 }
117
118 // handle LCAF address
119 if (afiCode == LCAF.getIanaCode()) {
120 return new LispLcafAddress.LcafAddressReader().readFrom(byteBuf);
121 }
122
123 // handle autonomous system address
124 if (afiCode == AS.getIanaCode()) {
125 return new LispAsAddress.AsAddressReader().readFrom(byteBuf);
126 }
127
128 return null;
129 }
130 }
GUNiba871702016-08-22 21:06:02 +0900131
132 /**
133 * AFI address writer class.
134 */
135 public static class AfiAddressWriter implements LispAddressWriter<LispAfiAddress> {
136
137 @Override
138 public void writeTo(ByteBuf byteBuf, LispAfiAddress address) throws LispWriterException {
Jian Li76ea0572016-08-29 12:41:16 +0900139
140 // AFI code
141 byteBuf.writeShort(address.getAfi().getIanaCode());
142
GUNiba871702016-08-22 21:06:02 +0900143 switch (address.getAfi()) {
Jian Li6ef1b3f2016-11-12 18:16:06 +0900144 case NO_ADDRESS:
145 new LispNoAddress.NoAddressWriter().writeTo(byteBuf, (LispNoAddress) address);
146 break;
Jian Lid4e63702016-08-30 18:29:20 +0900147 case IP4:
GUNiba871702016-08-22 21:06:02 +0900148 new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv4Address) address);
149 break;
150 case IP6:
151 new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv6Address) address);
152 break;
153 case DISTINGUISHED_NAME:
154 new LispDistinguishedNameAddress.DistinguishedNameAddressWriter().writeTo(byteBuf,
155 (LispDistinguishedNameAddress) address);
156 break;
157 case MAC:
158 new LispMacAddress.MacAddressWriter().writeTo(byteBuf, (LispMacAddress) address);
159 break;
160 case LCAF:
161 new LispLcafAddress.LcafAddressWriter().writeTo(byteBuf, (LispLcafAddress) address);
162 break;
163 case AS:
164 new LispAsAddress.AsAddressWriter().writeTo(byteBuf, (LispAsAddress) address);
165 break;
166 default: break; // TODO: need log warning message
167 }
168 }
169 }
Jian Li6b77dc02016-07-14 16:04:25 +0900170}