blob: 4e9db1ee9c66746d1d4e3e944f9033dd4695e0dd [file] [log] [blame]
Thejaswi N Keeb18ee2015-10-15 14:16:28 +05301/*
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 */
16package org.onosproject.bgpio.types.attr;
17
18import java.util.Objects;
19
20import org.jboss.netty.buffer.ChannelBuffer;
21import org.onlab.packet.Ip4Address;
22import org.onlab.packet.Ip6Address;
Shashikanth VH5dd8dbe2015-11-26 13:22:18 +053023import org.onosproject.bgpio.exceptions.BgpParseException;
24import org.onosproject.bgpio.types.BgpErrorType;
25import org.onosproject.bgpio.types.BgpValueType;
Thejaswi N Keeb18ee2015-10-15 14:16:28 +053026import org.onosproject.bgpio.util.Validation;
27import org.slf4j.Logger;
28import org.slf4j.LoggerFactory;
29
30import com.google.common.base.MoreObjects;
31
32/**
33 * Implements BGP prefix OSPF Forwarding address attribute.
34 */
Shashikanth VH5dd8dbe2015-11-26 13:22:18 +053035public class BgpPrefixAttrOspfFwdAddr implements BgpValueType {
Thejaswi N Keeb18ee2015-10-15 14:16:28 +053036
37 protected static final Logger log = LoggerFactory
38 .getLogger(BgpPrefixAttrOspfFwdAddr.class);
39
40 public static final int ATTR_PREFIX_OSPFFWDADDR = 1156;
41 public static final int IPV4_LEN = 4;
42 public static final int IPV6_LEN = 16;
43
44 /* OSPF Forwarding Address */
45 private final short lsAttrLength;
46 private final Ip4Address ip4RouterId;
47 private final Ip6Address ip6RouterId;
48
49 /**
50 * Constructor to initialize the value.
51 *
52 * @param lsAttrLength length of the IP address
53 * @param ip4RouterId Valid IPV4 address if length is 4 else null
54 * @param ip6RouterId Valid IPV6 address if length is 16 else null
55 */
56 public BgpPrefixAttrOspfFwdAddr(short lsAttrLength, Ip4Address ip4RouterId,
57 Ip6Address ip6RouterId) {
58 this.lsAttrLength = lsAttrLength;
59 this.ip4RouterId = ip4RouterId;
60 this.ip6RouterId = ip6RouterId;
61 }
62
63 /**
64 * Returns object of this class with specified values.
65 *
66 * @param lsAttrLength length of the IP address
67 * @param ip4RouterId Valid IPV4 address if length is 4 else null
68 * @param ip6RouterId Valid IPV6 address if length is 16 else null
69 * @return object of BgpPrefixAttrOspfFwdAddr
70 */
71 public static BgpPrefixAttrOspfFwdAddr of(final short lsAttrLength,
72 final Ip4Address ip4RouterId,
73 final Ip6Address ip6RouterId) {
74 return new BgpPrefixAttrOspfFwdAddr(lsAttrLength, ip4RouterId,
75 ip6RouterId);
76 }
77
78 /**
79 * Reads the OSPF Forwarding Address.
80 *
81 * @param cb ChannelBuffer
82 * @return object of BgpPrefixAttrOSPFFwdAddr
Shashikanth VH5dd8dbe2015-11-26 13:22:18 +053083 * @throws BgpParseException while parsing BgpPrefixAttrOspfFwdAddr
Thejaswi N Keeb18ee2015-10-15 14:16:28 +053084 */
85 public static BgpPrefixAttrOspfFwdAddr read(ChannelBuffer cb)
Shashikanth VH5dd8dbe2015-11-26 13:22:18 +053086 throws BgpParseException {
Thejaswi N Keeb18ee2015-10-15 14:16:28 +053087 short lsAttrLength;
88 byte[] ipBytes;
89 Ip4Address ip4RouterId = null;
90 Ip6Address ip6RouterId = null;
91
92 lsAttrLength = cb.readShort();
93 ipBytes = new byte[lsAttrLength];
94
95 if ((cb.readableBytes() < lsAttrLength)) {
Shashikanth VH5dd8dbe2015-11-26 13:22:18 +053096 Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
97 BgpErrorType.ATTRIBUTE_LENGTH_ERROR,
Thejaswi N Keeb18ee2015-10-15 14:16:28 +053098 lsAttrLength);
99 }
100
101 cb.readBytes(ipBytes);
102
103 if (IPV4_LEN == lsAttrLength) {
104 ip4RouterId = Ip4Address.valueOf(ipBytes);
105 } else if (IPV6_LEN == lsAttrLength) {
106 ip6RouterId = Ip6Address.valueOf(ipBytes);
107 }
108
109 return BgpPrefixAttrOspfFwdAddr.of(lsAttrLength, ip4RouterId,
110 ip6RouterId);
111 }
112
113 /**
114 * Returns IPV4 Address of OSPF forwarding address.
115 *
116 * @return IPV4 address
117 */
118 public Ip4Address ospfv4FwdAddr() {
119 return ip4RouterId;
120 }
121
122 /**
123 * Returns IPV6 Address of OSPF forwarding address.
124 *
125 * @return IPV6 address
126 */
127 public Ip6Address ospfv6FwdAddr() {
128 return ip6RouterId;
129 }
130
131 /**
132 * Returns OSPF forwarding address length.
133 *
134 * @return length of the ip address
135 */
136 public short ospfFwdAddrLen() {
137 return lsAttrLength;
138 }
139
140 @Override
141 public short getType() {
142 return ATTR_PREFIX_OSPFFWDADDR;
143 }
144
145 @Override
146 public int hashCode() {
147 if (IPV4_LEN == lsAttrLength) {
148 return Objects.hash(ip4RouterId);
149 } else {
150 return Objects.hash(ip6RouterId);
151 }
152 }
153
154 @Override
155 public boolean equals(Object obj) {
156 if (this == obj) {
157 return true;
158 }
159
160 if (obj instanceof BgpPrefixAttrOspfFwdAddr) {
161 BgpPrefixAttrOspfFwdAddr other = (BgpPrefixAttrOspfFwdAddr) obj;
162 if (IPV4_LEN == lsAttrLength) {
163 return Objects.equals(ip4RouterId, other.ip4RouterId);
164 } else {
165 return Objects.equals(ip6RouterId, other.ip6RouterId);
166 }
167 }
168 return false;
169 }
170
171 @Override
172 public int write(ChannelBuffer cb) {
173 // TODO This will be implemented in the next version
174 return 0;
175 }
176
177 @Override
178 public String toString() {
179 if (IPV4_LEN == lsAttrLength) {
180 return MoreObjects.toStringHelper(getClass()).omitNullValues()
181 .add("ip4RouterId", ip4RouterId).toString();
182 } else {
183 return MoreObjects.toStringHelper(getClass()).omitNullValues()
184 .add("ip6RouterId", ip6RouterId).toString();
185 }
186 }
Priyanka B02040732015-11-29 11:30:29 +0530187
188 @Override
189 public int compareTo(Object o) {
190 // TODO Auto-generated method stub
191 return 0;
192 }
Thejaswi N Keeb18ee2015-10-15 14:16:28 +0530193}