/*_##########################################################################
_##
_## Copyright (C) 2011-2012 Kaito Yamada
_##
_##########################################################################
*/
package com.github.kaitoy.sneo.network.protocol;
import org.pcap4j.packet.AbstractPacket.AbstractBuilder;
import org.pcap4j.packet.ArpPacket;
import org.pcap4j.packet.Dot1qVlanTagPacket;
import org.pcap4j.packet.EthernetPacket;
import org.pcap4j.packet.IpV4Packet;
import org.pcap4j.packet.IpV6Packet;
import org.pcap4j.packet.Packet;
import org.pcap4j.packet.namednumber.EtherType;
import org.pcap4j.util.MacAddress;
public final class EthernetHelper {
private EthernetHelper() { throw new AssertionError(); }
public static boolean matchesDestination(Packet packet, MacAddress addr) {
EthernetPacket etherPacket = packet.get(EthernetPacket.class);
if (etherPacket == null) {
throw new IllegalArgumentException(packet.toString());
}
MacAddress dst
= etherPacket.getHeader().getDstAddr();
return dst.equals(addr)
|| dst.equals(MacAddress.ETHER_BROADCAST_ADDRESS);
}
public static EthernetPacket pack(
final Packet payload, MacAddress src, MacAddress dst
) {
EtherType type;
if (payload instanceof IpV4Packet) {
type = EtherType.IPV4;
}
else if (payload instanceof IpV6Packet) {
type = EtherType.IPV6;
}
else if (payload instanceof ArpPacket) {
type = EtherType.ARP;
}
else if (payload instanceof Dot1qVlanTagPacket) {
type = EtherType.DOT1Q_VLAN_TAGGED_FRAMES;
}
else {
throw new AssertionError(payload.getClass().getName());
}
EthernetPacket.Builder etherBuilder = new EthernetPacket.Builder();
return etherBuilder.dstAddr(dst)
.srcAddr(src)
.type(type)
.payloadBuilder(
new AbstractBuilder() {
@Override
public Packet build() {
return payload;
}
}
)
.paddingAtBuild(true)
.build();
}
}