blob: 6c83b16f922553aab277bf3a2497d1cebca1e4d1 [file] [log] [blame]
Yotam Harcholf3f11152013-09-05 16:47:16 -07001package org.projectfloodlight.openflow.types;
2
3import org.jboss.netty.buffer.ChannelBuffer;
4
5
6
7/**
Yotam Harchola289d552013-09-16 10:10:40 -07008 * Wrapper around an IPv4Address address
Yotam Harcholf3f11152013-09-05 16:47:16 -07009 *
10 * @author Andreas Wundsam <andreas.wundsam@bigswitch.com>
11 */
Yotam Harchol4d634682013-09-26 13:21:06 -070012public class IPv4Address extends IPAddress<IPv4Address> {
Yotam Harcholf3f11152013-09-05 16:47:16 -070013 static final int LENGTH = 4;
14 private final int rawValue;
Yotam Harcholf3f11152013-09-05 16:47:16 -070015
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070016 private final static int NONE_VAL = 0x0;
17 public final static IPv4Address NONE = new IPv4Address(NONE_VAL);
18
Yotam Harchola289d552013-09-16 10:10:40 -070019 public static final IPv4Address NO_MASK = IPv4Address.of(0xFFFFFFFF);
20 public static final IPv4Address FULL_MASK = IPv4Address.of(0x00000000);
21
22 private IPv4Address(final int rawValue) {
Yotam Harcholf3f11152013-09-05 16:47:16 -070023 this.rawValue = rawValue;
24 }
25
Yotam Harchol4d634682013-09-26 13:21:06 -070026 @Override
27 public IpVersion getIpVersion() {
28 return IpVersion.IPv4;
29 }
30
Yotam Harchola289d552013-09-16 10:10:40 -070031 public static IPv4Address of(final byte[] address) {
Yotam Harcholf3f11152013-09-05 16:47:16 -070032 if (address.length != LENGTH) {
33 throw new IllegalArgumentException(
Yotam Harchola289d552013-09-16 10:10:40 -070034 "Invalid byte array length for IPv4Address address: " + address);
Yotam Harcholf3f11152013-09-05 16:47:16 -070035 }
36
37 int raw =
38 (address[0] & 0xFF) << 24 | (address[1] & 0xFF) << 16
39 | (address[2] & 0xFF) << 8 | (address[3] & 0xFF) << 0;
Yotam Harchola289d552013-09-16 10:10:40 -070040 return IPv4Address.of(raw);
Yotam Harcholf3f11152013-09-05 16:47:16 -070041 }
42
Yotam Harchola289d552013-09-16 10:10:40 -070043 public static IPv4Address of(final int raw) {
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070044 if(raw == NONE_VAL)
45 return NONE;
Yotam Harchola289d552013-09-16 10:10:40 -070046 return new IPv4Address(raw);
Yotam Harcholf3f11152013-09-05 16:47:16 -070047 }
48
Yotam Harchola289d552013-09-16 10:10:40 -070049 public static IPv4Address of(final String string) {
Yotam Harcholf3f11152013-09-05 16:47:16 -070050 int start = 0;
51 int shift = 24;
52
53 int raw = 0;
54 while (shift >= 0) {
55 int end = string.indexOf('.', start);
56 if (end == start || !((shift > 0) ^ (end < 0)))
57 throw new IllegalArgumentException("IP Address not well formed: " + string);
58
59 String substr =
60 end > 0 ? string.substring(start, end) : string.substring(start);
61 int val = Integer.parseInt(substr);
62 if (val < 0 || val > 255)
63 throw new IllegalArgumentException("IP Address not well formed: " + string);
64
65 raw |= val << shift;
66
67 shift -= 8;
68 start = end + 1;
69 }
Yotam Harchola289d552013-09-16 10:10:40 -070070 return IPv4Address.of(raw);
Yotam Harcholf3f11152013-09-05 16:47:16 -070071 }
72
73 public int getInt() {
74 return rawValue;
75 }
76
77 volatile byte[] bytesCache = null;
78
79 public byte[] getBytes() {
80 if (bytesCache == null) {
81 synchronized (this) {
82 if (bytesCache == null) {
83 bytesCache =
84 new byte[] { (byte) ((rawValue >>> 24) & 0xFF),
85 (byte) ((rawValue >>> 16) & 0xFF),
86 (byte) ((rawValue >>> 8) & 0xFF),
87 (byte) ((rawValue >>> 0) & 0xFF) };
88 }
89 }
90 }
91 return bytesCache;
92 }
93
94 @Override
95 public int getLength() {
96 return LENGTH;
97 }
98
99 @Override
100 public String toString() {
101 StringBuilder res = new StringBuilder();
102 res.append((rawValue >> 24) & 0xFF).append('.');
103 res.append((rawValue >> 16) & 0xFF).append('.');
104 res.append((rawValue >> 8) & 0xFF).append('.');
105 res.append((rawValue >> 0) & 0xFF);
106 return res.toString();
107 }
108
109 @Override
110 public int hashCode() {
111 final int prime = 31;
112 int result = 1;
113 result = prime * result + rawValue;
114 return result;
115 }
116
117 @Override
118 public boolean equals(final Object obj) {
119 if (this == obj)
120 return true;
121 if (obj == null)
122 return false;
123 if (getClass() != obj.getClass())
124 return false;
Yotam Harchola289d552013-09-16 10:10:40 -0700125 IPv4Address other = (IPv4Address) obj;
Yotam Harcholf3f11152013-09-05 16:47:16 -0700126 if (rawValue != other.rawValue)
127 return false;
128 return true;
129 }
Yotam Harchola289d552013-09-16 10:10:40 -0700130
Yotam Harcholf3f11152013-09-05 16:47:16 -0700131 public void write4Bytes(ChannelBuffer c) {
132 c.writeInt(rawValue);
133 }
Yotam Harchola289d552013-09-16 10:10:40 -0700134
135 public static IPv4Address read4Bytes(ChannelBuffer c) {
136 return IPv4Address.of(c.readInt());
Yotam Harcholf3f11152013-09-05 16:47:16 -0700137 }
138
139 @Override
Yotam Harchola289d552013-09-16 10:10:40 -0700140 public IPv4Address applyMask(IPv4Address mask) {
141 return IPv4Address.of(this.rawValue & mask.rawValue);
Yotam Harcholf3f11152013-09-05 16:47:16 -0700142 }
143
Yotam Harchola289d552013-09-16 10:10:40 -0700144
Yotam Harcholf3f11152013-09-05 16:47:16 -0700145}