blob: 83dad7b101226df7272c5ac5081c654369ca7077 [file] [log] [blame]
Jian Li6b77dc02016-07-14 16:04:25 +09001/*
2 * Copyright 2016-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.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;
79 if (afi != other.afi) {
80 return false;
81 }
82 return true;
83 }
Jian Lia7b394d2016-08-21 23:11:46 +090084
GUNiba871702016-08-22 21:06:02 +090085 /**
86 * AFI address reader class.
87 */
Jian Lia7b394d2016-08-21 23:11:46 +090088 public static class AfiAddressReader implements LispAddressReader<LispAfiAddress> {
89
90 @Override
91 public LispAfiAddress readFrom(ByteBuf byteBuf)
92 throws LispParseError, LispReaderException {
93
94 int index = byteBuf.readerIndex();
95
96 // AFI code -> 16 bits
97 short afiCode = (short) byteBuf.getUnsignedShort(index);
98
Jian Lif11594a2016-10-31 18:16:02 +090099 // handle no address
100 if (afiCode == NO_ADDRESS.getIanaCode()) {
101 byteBuf.readUnsignedShort();
Jian Li6ef1b3f2016-11-12 18:16:06 +0900102 return new LispNoAddress.NoAddressReader().readFrom(byteBuf);
Jian Lif11594a2016-10-31 18:16:02 +0900103 }
104
Jian Lia7b394d2016-08-21 23:11:46 +0900105 // handle IPv4 and IPv6 address
Jian Lid4e63702016-08-30 18:29:20 +0900106 if (afiCode == IP4.getIanaCode() ||
Jian Lia7b394d2016-08-21 23:11:46 +0900107 afiCode == IP6.getIanaCode()) {
108 return new LispIpAddress.IpAddressReader().readFrom(byteBuf);
109 }
110
111 // handle distinguished name address
112 if (afiCode == DISTINGUISHED_NAME.getIanaCode()) {
113 return new LispDistinguishedNameAddress.DistinguishedNameAddressReader().readFrom(byteBuf);
114 }
115
116 // handle MAC address
117 if (afiCode == MAC.getIanaCode()) {
118 return new LispMacAddress.MacAddressReader().readFrom(byteBuf);
119 }
120
121 // handle LCAF address
122 if (afiCode == LCAF.getIanaCode()) {
123 return new LispLcafAddress.LcafAddressReader().readFrom(byteBuf);
124 }
125
126 // handle autonomous system address
127 if (afiCode == AS.getIanaCode()) {
128 return new LispAsAddress.AsAddressReader().readFrom(byteBuf);
129 }
130
131 return null;
132 }
133 }
GUNiba871702016-08-22 21:06:02 +0900134
135 /**
136 * AFI address writer class.
137 */
138 public static class AfiAddressWriter implements LispAddressWriter<LispAfiAddress> {
139
140 @Override
141 public void writeTo(ByteBuf byteBuf, LispAfiAddress address) throws LispWriterException {
Jian Li76ea0572016-08-29 12:41:16 +0900142
143 // AFI code
144 byteBuf.writeShort(address.getAfi().getIanaCode());
145
GUNiba871702016-08-22 21:06:02 +0900146 switch (address.getAfi()) {
Jian Li6ef1b3f2016-11-12 18:16:06 +0900147 case NO_ADDRESS:
148 new LispNoAddress.NoAddressWriter().writeTo(byteBuf, (LispNoAddress) address);
149 break;
Jian Lid4e63702016-08-30 18:29:20 +0900150 case IP4:
GUNiba871702016-08-22 21:06:02 +0900151 new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv4Address) address);
152 break;
153 case IP6:
154 new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv6Address) address);
155 break;
156 case DISTINGUISHED_NAME:
157 new LispDistinguishedNameAddress.DistinguishedNameAddressWriter().writeTo(byteBuf,
158 (LispDistinguishedNameAddress) address);
159 break;
160 case MAC:
161 new LispMacAddress.MacAddressWriter().writeTo(byteBuf, (LispMacAddress) address);
162 break;
163 case LCAF:
164 new LispLcafAddress.LcafAddressWriter().writeTo(byteBuf, (LispLcafAddress) address);
165 break;
166 case AS:
167 new LispAsAddress.AsAddressWriter().writeTo(byteBuf, (LispAsAddress) address);
168 break;
169 default: break; // TODO: need log warning message
170 }
171 }
172 }
Jian Li6b77dc02016-07-14 16:04:25 +0900173}