1 22 23 package org.snmp4j.agent.agentx; 24 25 import java.io.IOException ; 26 import java.nio.ByteBuffer ; 27 import java.nio.ByteOrder ; 28 import org.snmp4j.log.LogFactory; 29 import org.snmp4j.log.LogAdapter; 30 import org.snmp4j.smi.OctetString; 31 32 public abstract class AgentXPDU { 33 34 private static final LogAdapter logger = 35 LogFactory.getLogger(AgentXPDU.class); 36 37 public static final byte RESERVED = (byte)0; 38 39 public static final byte AGENTX_OPEN_PDU = 1; 40 public static final byte AGENTX_CLOSE_PDU = 2; 41 public static final byte AGENTX_REGISTER_PDU = 3; 42 public static final byte AGENTX_UNREGISTER_PDU = 4; 43 public static final byte AGENTX_GET_PDU = 5; 44 public static final byte AGENTX_GETNEXT_PDU = 6; 45 public static final byte AGENTX_GETBULK_PDU = 7; 46 public static final byte AGENTX_TESTSET_PDU = 8; 47 public static final byte AGENTX_COMMITSET_PDU = 9; 48 public static final byte AGENTX_UNDOSET_PDU =10; 49 public static final byte AGENTX_CLEANUPSET_PDU =11; 50 public static final byte AGENTX_NOTIFY_PDU =12; 51 public static final byte AGENTX_PING_PDU =13; 52 public static final byte AGENTX_INDEXALLOCATE_PDU =14; 53 public static final byte AGENTX_INDEXDEALLOCATE_PDU =15; 54 public static final byte AGENTX_ADDAGENTCAPS_PDU =16; 55 public static final byte AGENTX_REMOVEAGENTCAPS_PDU =17; 56 public static final byte AGENTX_RESPONSE_PDU =18; 57 58 protected byte type; 59 protected byte version = AgentXProtocol.VERSION_1_0; 60 protected int sessionID; 61 protected int transactionID; 62 protected int packetID; 63 protected byte flags; 64 protected ByteOrder byteOrder; 65 66 protected AgentXPDU(byte type) { 67 this.type = type; 68 } 69 70 protected AgentXPDU(byte type, byte flags, 71 int sessionID, int transactionID, int packetID) { 72 this.type = type; 73 this.flags = flags; 74 this.sessionID = sessionID; 75 this.transactionID = transactionID; 76 this.packetID = packetID; 77 byteOrder = isFlagSet(AgentXProtocol.FLAG_NETWORK_BYTE_ORDER) ? 78 ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; 79 } 80 81 protected AgentXPDU(AgentXMessageHeader header) { 82 this(header.getType(), header.getFlags(), header.getSessionID(), 83 header.getTransactionID(), header.getPacketID()); 84 } 85 86 public final void addFlag(byte flag) { 87 this.flags |= flag; 88 } 89 90 public final boolean isFlagSet(int flag) { 91 return ((this.flags & flag) != 0); 92 } 93 94 public final byte getFlags() { 95 return flags; 96 } 97 98 public final int getPacketID() { 99 return packetID; 100 } 101 102 public final int getSessionID() { 103 return sessionID; 104 } 105 106 public final byte getType() { 107 return type; 108 } 109 110 public final byte getVersion() { 111 return version; 112 } 113 114 public final ByteOrder getByteOrder() { 115 return byteOrder; 116 } 117 118 public final int getTransactionID() { 119 return transactionID; 120 } 121 122 public void setFlags(byte flags) { 123 this.flags = flags; 124 } 125 126 public void setPacketID(int packetID) { 127 this.packetID = packetID; 128 } 129 130 public void setSessionID(int sessionID) { 131 this.sessionID = sessionID; 132 } 133 134 public void setType(byte type) { 135 this.type = type; 136 } 137 138 public void setVersion(byte version) { 139 this.version = version; 140 } 141 142 public void setByteOrder(ByteOrder byteOrder) { 143 this.byteOrder = byteOrder; 144 } 145 146 public void setTransactionID(int transactionID) { 147 this.transactionID = transactionID; 148 } 149 150 public void setSessionAttributes(AgentXSession session) { 151 setSessionID(session.getSessionID()); 152 setByteOrder(session.getByteOrder()); 153 } 154 155 protected abstract void encodePayload(ByteBuffer buf); 156 157 public abstract int getPayloadLength(); 158 159 public final void encode(ByteBuffer buf) { 160 beforeEncode(); 161 buf.put(version); 162 buf.put(type); 163 if (byteOrder == null) { 164 byteOrder = ByteOrder.nativeOrder(); 165 } 166 if (byteOrder == ByteOrder.BIG_ENDIAN) { 167 flags |= AgentXProtocol.FLAG_NETWORK_BYTE_ORDER; 168 } 169 else { 170 flags &= ~AgentXProtocol.FLAG_NETWORK_BYTE_ORDER; 171 } 172 buf.order(byteOrder); 173 buf.put(flags); 174 buf.put(RESERVED); 175 buf.putInt(sessionID); 176 buf.putInt(transactionID); 177 buf.putInt(packetID); 178 buf.putInt(getPayloadLength()); 179 encodePayload(buf); 180 } 181 182 185 protected abstract void beforeEncode(); 186 187 public abstract void decodePayload(ByteBuffer buf, int length) 188 throws IOException ; 189 190 public static AgentXPDU decode(ByteBuffer buf) throws IOException { 191 AgentXMessageHeader header = AgentXProtocol.decodeHeader(buf); 192 if (buf.remaining() < header.getPayloadLength()) { 193 throw new IOException ("Short AgentX PDU with payload length="+ 194 header.getPayloadLength()+"<"+ 195 buf.remaining()+" remaining length"); 196 } 197 try { 198 AgentXPDU pdu = createAgentXPDU(header); 199 pdu.decodePayload(buf, header.getPayloadLength()); 200 return pdu; 201 } 202 catch (IOException iox) { 203 logger.warn("IO Exception while parsing AgentX PDU with header "+header+ 204 ", exception is: "+iox.getMessage()); 205 throw new AgentXParseException(header, iox); 206 } 207 } 208 209 private static AgentXPDU createAgentXPDU(AgentXMessageHeader header) { 210 AgentXPDU pdu = null; 211 switch (header.getType()) { 212 case AGENTX_OPEN_PDU: { 213 pdu = new AgentXOpenPDU(header); 214 break; 215 } 216 case AGENTX_CLOSE_PDU: { 217 pdu = new AgentXClosePDU(header); 218 break; 219 } 220 case AGENTX_RESPONSE_PDU: { 221 pdu = new AgentXResponsePDU(header); 222 break; 223 } 224 case AGENTX_ADDAGENTCAPS_PDU: { 225 pdu = new AgentXAddAgentCapsPDU(header); 226 break; 227 } 228 case AGENTX_CLEANUPSET_PDU: { 229 pdu = new AgentXCleanupSetPDU(header); 230 break; 231 } 232 case AGENTX_COMMITSET_PDU: { 233 pdu = new AgentXCommitSetPDU(header); 234 break; 235 } 236 case AGENTX_GET_PDU: { 237 pdu = new AgentXGetPDU(header); 238 break; 239 } 240 case AGENTX_GETBULK_PDU: { 241 pdu = new AgentXGetBulkPDU(header); 242 break; 243 } 244 case AGENTX_GETNEXT_PDU: { 245 pdu = new AgentXGetNextPDU(header); 246 break; 247 } 248 case AGENTX_INDEXALLOCATE_PDU: { 249 pdu = new AgentXIndexAllocatePDU(header); 250 break; 251 } 252 case AGENTX_INDEXDEALLOCATE_PDU: { 253 pdu = new AgentXIndexDeallocatePDU(header); 254 break; 255 } 256 case AGENTX_NOTIFY_PDU: { 257 pdu = new AgentXNotifyPDU(header); 258 break; 259 } 260 case AGENTX_PING_PDU: { 261 pdu = new AgentXPingPDU(header); 262 break; 263 } 264 case AGENTX_REGISTER_PDU: { 265 pdu = new AgentXRegisterPDU(header); 266 break; 267 } 268 case AGENTX_REMOVEAGENTCAPS_PDU: { 269 pdu = new AgentXRemoveAgentCapsPDU(header); 270 break; 271 } 272 case AGENTX_TESTSET_PDU: { 273 pdu = new AgentXTestSetPDU(header); 274 break; 275 } 276 case AGENTX_UNDOSET_PDU: { 277 pdu = new AgentXUndoSetPDU(header); 278 break; 279 } 280 case AGENTX_UNREGISTER_PDU: { 281 pdu = new AgentXUnregisterPDU(header); 282 break; 283 } 284 default: 285 break; 286 } 287 return pdu; 288 } 289 290 public final boolean isConfirmedPDU() { 291 if (getType() == AGENTX_RESPONSE_PDU) { 292 return false; 293 } 294 return true; 295 } 296 297 protected String toStringExtMembers() { 298 return ""; 299 } 300 301 public String toString() { 302 return getClass().getName()+"[type="+type+",version="+version+ 303 ",sessionID="+sessionID+",transactionID="+transactionID+ 304 ",packetID="+packetID+",byteOrder="+byteOrder+toStringExtMembers()+"]"; 305 } 306 307 public static void main(String [] args) { 308 OctetString s = OctetString.fromHexString(args[0]); 309 ByteBuffer buf = ByteBuffer.wrap(s.toByteArray()); 310 try { 311 AgentXPDU pdu = AgentXPDU.decode(buf); 312 System.out.println(pdu.toString()); 313 } 314 catch (IOException ex) { 315 ex.printStackTrace(); 316 } 317 } 318 } 319 | Popular Tags |