blob: 5ab940d4cf2a126037675f7fd3fbfd891601adf6 [file] [log] [blame]
Yotam Harcholf3f11152013-09-05 16:47:16 -07001package org.projectfloodlight.openflow.types;
2
3import org.jboss.netty.buffer.ChannelBuffer;
4
5public class ArpOpcode implements OFValueType<ArpOpcode> {
6
7 final static int LENGTH = 2;
8
9 private static final int ARP_OPCODE_VAL_REQUEST = 1;
10 private static final int ARP_OPCODE_VAL_REPLY = 2;
11 private static final int ARP_OPCODE_VAL_REQUEST_REVERSE = 3;
12 private static final int ARP_OPCODE_VAL_REPLY_REVERSE = 4;
13 private static final int ARP_OPCODE_VAL_DRARP_REQUEST = 5;
14 private static final int ARP_OPCODE_VAL_DRARP_REPLY = 6;
15 private static final int ARP_OPCODE_VAL_DRARP_ERROR = 7;
16 private static final int ARP_OPCODE_VAL_INARP_REQUEST = 8;
17 private static final int ARP_OPCODE_VAL_INARP_REPLY = 9;
18 private static final int ARP_OPCODE_VAL_ARP_NAK = 10;
19 private static final int ARP_OPCODE_VAL_MARS_REQUEST = 11;
20 private static final int ARP_OPCODE_VAL_MARS_MULTI = 12;
21 private static final int ARP_OPCODE_VAL_MARS_MSERV = 13;
22 private static final int ARP_OPCODE_VAL_MARS_JOIN = 14;
23 private static final int ARP_OPCODE_VAL_MARS_LEAVE = 15;
24 private static final int ARP_OPCODE_VAL_MARS_NAK = 16;
25 private static final int ARP_OPCODE_VAL_MARS_UNSERV = 17;
26 private static final int ARP_OPCODE_VAL_MARS_SJOIN = 18;
27 private static final int ARP_OPCODE_VAL_MARS_SLEAVE = 19;
28 private static final int ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST = 20;
29 private static final int ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY = 21;
30 private static final int ARP_OPCODE_VAL_MARS_REDIRECT_MAP = 22;
31 private static final int ARP_OPCODE_VAL_MAPOS_UNARP = 23;
32 private static final int ARP_OPCODE_VAL_OP_EXP1 = 24;
33 private static final int ARP_OPCODE_VAL_OP_EXP2 = 25;
34
35 public static final ArpOpcode ARP_OPCODE_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_REQUEST);
36 public static final ArpOpcode ARP_OPCODE_REPLY = new ArpOpcode(ARP_OPCODE_VAL_REPLY);
37 public static final ArpOpcode ARP_OPCODE_REQUEST_REVERSE = new ArpOpcode(ARP_OPCODE_VAL_REQUEST_REVERSE);
38 public static final ArpOpcode ARP_OPCODE_REPLY_REVERSE = new ArpOpcode(ARP_OPCODE_VAL_REPLY_REVERSE);
39 public static final ArpOpcode ARP_OPCODE_DRARP_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_DRARP_REQUEST);
40 public static final ArpOpcode ARP_OPCODE_DRARP_REPLY = new ArpOpcode(ARP_OPCODE_VAL_DRARP_REPLY);
41 public static final ArpOpcode ARP_OPCODE_DRARP_ERROR = new ArpOpcode(ARP_OPCODE_VAL_DRARP_ERROR);
42 public static final ArpOpcode ARP_OPCODE_INARP_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_INARP_REQUEST);
43 public static final ArpOpcode ARP_OPCODE_INARP_REPLY = new ArpOpcode(ARP_OPCODE_VAL_INARP_REPLY);
44 public static final ArpOpcode ARP_OPCODE_ARP_NAK = new ArpOpcode(ARP_OPCODE_VAL_ARP_NAK);
45 public static final ArpOpcode ARP_OPCODE_MARS_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_MARS_REQUEST);
46 public static final ArpOpcode ARP_OPCODE_MARS_MULTI = new ArpOpcode(ARP_OPCODE_VAL_MARS_MULTI);
47 public static final ArpOpcode ARP_OPCODE_MARS_MSERV = new ArpOpcode(ARP_OPCODE_VAL_MARS_MSERV);
48 public static final ArpOpcode ARP_OPCODE_MARS_JOIN = new ArpOpcode(ARP_OPCODE_VAL_MARS_JOIN);
49 public static final ArpOpcode ARP_OPCODE_MARS_LEAVE = new ArpOpcode(ARP_OPCODE_VAL_MARS_LEAVE);
50 public static final ArpOpcode ARP_OPCODE_MARS_NAK = new ArpOpcode(ARP_OPCODE_VAL_MARS_NAK);
51 public static final ArpOpcode ARP_OPCODE_MARS_UNSERV = new ArpOpcode(ARP_OPCODE_VAL_MARS_UNSERV);
52 public static final ArpOpcode ARP_OPCODE_MARS_SJOIN = new ArpOpcode(ARP_OPCODE_VAL_MARS_SJOIN);
53 public static final ArpOpcode ARP_OPCODE_MARS_SLEAVE = new ArpOpcode(ARP_OPCODE_VAL_MARS_SLEAVE);
54 public static final ArpOpcode ARP_OPCODE_MARS_GROUPLIST_REQUEST = new ArpOpcode(ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST);
55 public static final ArpOpcode ARP_OPCODE_MARS_GROUPLIST_REPLY = new ArpOpcode(ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY);
56 public static final ArpOpcode ARP_OPCODE_MARS_REDIRECT_MAP = new ArpOpcode(ARP_OPCODE_VAL_MARS_REDIRECT_MAP);
57 public static final ArpOpcode ARP_OPCODE_MAPOS_UNARP = new ArpOpcode(ARP_OPCODE_VAL_MAPOS_UNARP);
58 public static final ArpOpcode ARP_OPCODE_OP_EXP1 = new ArpOpcode(ARP_OPCODE_VAL_OP_EXP1);
59 public static final ArpOpcode ARP_OPCODE_OP_EXP2 = new ArpOpcode(ARP_OPCODE_VAL_OP_EXP2);
60
61 private static final int MIN_OPCODE = 0;
62 private static final int MAX_OPCODE = 0xFFFF;
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070063
64 private static final int NONE_VAL = 0;
65 public static final ArpOpcode NONE = new ArpOpcode(NONE_VAL);
66
Yotam Harcholf3f11152013-09-05 16:47:16 -070067 public static final ArpOpcode NO_MASK = new ArpOpcode(0xFFFFFFFF);
68 public static final ArpOpcode FULL_MASK = new ArpOpcode(0x00000000);
69
70 private final int opcode;
71
72 private ArpOpcode(int opcode) {
73 this.opcode = opcode;
74 }
75
76 @Override
77 public int getLength() {
78 return LENGTH;
79 }
80
81 public int getOpcode() {
82 return this.opcode;
83 }
84
85 public static ArpOpcode of(int opcode) {
86 if (opcode < MIN_OPCODE || opcode > MAX_OPCODE)
87 throw new IllegalArgumentException("Invalid ARP opcode: " + opcode);
88 switch (opcode) {
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -070089 case NONE_VAL:
90 return NONE;
Yotam Harcholf3f11152013-09-05 16:47:16 -070091 case ARP_OPCODE_VAL_REQUEST:
92 return ARP_OPCODE_REQUEST;
93 case ARP_OPCODE_VAL_REPLY:
94 return ARP_OPCODE_REPLY;
95 case ARP_OPCODE_VAL_REQUEST_REVERSE:
96 return ARP_OPCODE_REQUEST_REVERSE;
97 case ARP_OPCODE_VAL_REPLY_REVERSE:
98 return ARP_OPCODE_REPLY_REVERSE;
99 case ARP_OPCODE_VAL_DRARP_REQUEST:
100 return ARP_OPCODE_DRARP_REQUEST;
101 case ARP_OPCODE_VAL_DRARP_REPLY:
102 return ARP_OPCODE_DRARP_REPLY;
103 case ARP_OPCODE_VAL_DRARP_ERROR:
104 return ARP_OPCODE_DRARP_ERROR;
105 case ARP_OPCODE_VAL_INARP_REQUEST:
106 return ARP_OPCODE_INARP_REQUEST;
107 case ARP_OPCODE_VAL_INARP_REPLY:
108 return ARP_OPCODE_INARP_REPLY;
109 case ARP_OPCODE_VAL_ARP_NAK:
110 return ARP_OPCODE_ARP_NAK;
111 case ARP_OPCODE_VAL_MARS_REQUEST:
112 return ARP_OPCODE_MARS_REQUEST;
113 case ARP_OPCODE_VAL_MARS_MULTI:
114 return ARP_OPCODE_MARS_MULTI;
115 case ARP_OPCODE_VAL_MARS_MSERV:
116 return ARP_OPCODE_MARS_MSERV;
117 case ARP_OPCODE_VAL_MARS_JOIN:
118 return ARP_OPCODE_MARS_JOIN;
119 case ARP_OPCODE_VAL_MARS_LEAVE:
120 return ARP_OPCODE_MARS_LEAVE;
121 case ARP_OPCODE_VAL_MARS_NAK:
122 return ARP_OPCODE_MARS_NAK;
123 case ARP_OPCODE_VAL_MARS_UNSERV:
124 return ARP_OPCODE_MARS_UNSERV;
125 case ARP_OPCODE_VAL_MARS_SJOIN:
126 return ARP_OPCODE_MARS_SJOIN;
127 case ARP_OPCODE_VAL_MARS_SLEAVE:
128 return ARP_OPCODE_MARS_SLEAVE;
129 case ARP_OPCODE_VAL_MARS_GROUPLIST_REQUEST:
130 return ARP_OPCODE_MARS_GROUPLIST_REQUEST;
131 case ARP_OPCODE_VAL_MARS_GROUPLIST_REPLY:
132 return ARP_OPCODE_MARS_GROUPLIST_REPLY;
133 case ARP_OPCODE_VAL_MARS_REDIRECT_MAP:
134 return ARP_OPCODE_MARS_REDIRECT_MAP;
135 case ARP_OPCODE_VAL_MAPOS_UNARP:
136 return ARP_OPCODE_MAPOS_UNARP;
137 case ARP_OPCODE_VAL_OP_EXP1:
138 return ARP_OPCODE_OP_EXP1;
139 case ARP_OPCODE_VAL_OP_EXP2:
140 return ARP_OPCODE_OP_EXP2;
141 default:
142 return new ArpOpcode(opcode);
143 }
144 }
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -0700145
Yotam Harcholf3f11152013-09-05 16:47:16 -0700146 public void write2Bytes(ChannelBuffer c) {
147 c.writeShort(this.opcode);
148 }
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -0700149
Yotam Harcholf3f11152013-09-05 16:47:16 -0700150 public static ArpOpcode read2Bytes(ChannelBuffer c) {
151 return ArpOpcode.of(c.readUnsignedShort());
152 }
153
154 @Override
155 public ArpOpcode applyMask(ArpOpcode mask) {
156 return ArpOpcode.of(this.opcode & mask.opcode);
157 }
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -0700158
Yotam Harcholf3f11152013-09-05 16:47:16 -0700159 public int getOpCode() {
160 return opcode;
161 }
Andreas Wundsamb75c4ad2013-09-23 14:45:35 -0700162
Yotam Harcholf3f11152013-09-05 16:47:16 -0700163}