/* * Copyright 2010 NCHOVY * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.pcap.decoder.arp; import java.net.Inet4Address; import java.net.InetAddress; import java.nio.ByteBuffer; import org.krakenapps.pcap.Injectable; import org.krakenapps.pcap.decoder.ethernet.MacAddress; import org.krakenapps.pcap.util.Buffer; import org.krakenapps.pcap.util.ChainBuffer; import org.krakenapps.pcap.util.IpConverter; /** * ARP packet. * * @see http://en.wikipedia.org/wiki/Address_Resolution_Protocol * @author xeraph * @since 1.1 */ public class ArpPacket implements Injectable { private Object l2Frame; private int hardwareType; // should be 0x0001 private int protocolType; // should be 0x0800 private int hardwareSize; // should be 6 private int protocolSize; // should be 4 private int opcode; // request(1), reply(2) private MacAddress senderMac; private InetAddress senderIp; private MacAddress targetMac; private InetAddress targetIp; public static ArpPacket createRequest(MacAddress senderMac, InetAddress senderIp, InetAddress targetIp) { return createRequest(senderMac, senderIp, new MacAddress("ff:ff:ff:ff:ff:ff"), targetIp); } public static ArpPacket createRequest(MacAddress senderMac, InetAddress senderIp, MacAddress targetMac, InetAddress targetIp) { ArpPacket p = new ArpPacket(); p.hardwareType = 0x0001; p.protocolType = 0x0800; p.hardwareSize = 6; p.protocolSize = 4; p.opcode = 1; p.senderMac = senderMac; p.senderIp = senderIp; p.targetMac = targetMac; p.targetIp = targetIp; return p; } public static ArpPacket createReply(MacAddress senderMac, InetAddress senderIp, MacAddress targetMac, InetAddress targetIp) { ArpPacket p = new ArpPacket(); p.hardwareType = 0x0001; p.protocolType = 0x0800; p.hardwareSize = 6; p.protocolSize = 4; p.opcode = 2; p.senderMac = senderMac; p.senderIp = senderIp; p.targetMac = targetMac; p.targetIp = targetIp; return p; } /* copy constructor */ public static ArpPacket copyArpPacket(ArpPacket arp) { ArpPacket p = new ArpPacket(); p.hardwareType = 0x0001; p.protocolType = 0x0800; p.hardwareSize = 6; p.protocolSize = 4; p.opcode = arp.getOpcode(); p.senderMac = arp.getSenderMac(); p.senderIp = arp.getSenderIp(); p.targetMac = arp.getTargetMac(); p.targetIp = arp.getTargetIp(); return p; } public Object getL2Frame() { return l2Frame; } public void setL2Frame(Object l2Frame) { this.l2Frame = l2Frame; } public int getHardwareType() { return hardwareType; } public void setHardwareType(short hardwareType) { this.hardwareType = hardwareType; } public int getProtocolType() { return protocolType; } public void setProtocolType(int protocolType) { this.protocolType = protocolType; } public int getHardwareSize() { return hardwareSize; } public void setHardwareSize(byte hardwareSize) { this.hardwareSize = hardwareSize; } public int getProtocolSize() { return protocolSize; } public void setProtocolSize(byte protocolSize) { this.protocolSize = protocolSize; } public boolean isRequest() { return opcode == 1; } public boolean isReply() { return opcode == 2; } public int getOpcode() { return opcode; } public void setOpcode(short opcode) { this.opcode = opcode; } public MacAddress getSenderMac() { return senderMac; } public void setSenderMac(MacAddress senderMac) { this.senderMac = senderMac; } public InetAddress getSenderIp() { return senderIp; } public void setSenderIp(InetAddress senderIp) { this.senderIp = senderIp; } public MacAddress getTargetMac() { return targetMac; } public void setTargetMac(MacAddress targetMac) { this.targetMac = targetMac; } public InetAddress getTargetIp() { return targetIp; } public void setTargetIp(InetAddress targetIp) { this.targetIp = targetIp; } @Override public String toString() { if (isRequest()) return String.format("Who has %s? Tell %s", targetIp.getHostAddress(), senderIp.getHostAddress()); else return String.format("%s is at %s", senderIp.getHostAddress(), senderMac); } @Override public Buffer getBuffer() { ByteBuffer b = ByteBuffer.allocate(28); b.putShort((short) hardwareType); b.putShort((short) protocolType); b.put((byte) hardwareSize); b.put((byte) protocolSize); b.putShort((short) opcode); b.put(senderMac.getBytes()); b.putInt(IpConverter.toInt((Inet4Address) senderIp)); b.put(targetMac.getBytes()); b.putInt(IpConverter.toInt((Inet4Address) targetIp)); return new ChainBuffer(b.array()); } }