/*_########################################################################## _## _## Copyright (C) 2012 Kaito Yamada _## _########################################################################## */ package com.github.kaitoy.sneo.transport; import java.io.IOException; import java.net.InetAddress; import java.nio.ByteBuffer; import org.pcap4j.packet.IpV4Packet; import org.pcap4j.packet.IpV6Packet; import org.pcap4j.packet.Packet; import org.pcap4j.packet.UdpPacket; import org.snmp4j.smi.Address; import org.snmp4j.smi.UdpAddress; import org.snmp4j.transport.UdpTransportMapping; import com.github.kaitoy.sneo.network.Node; import com.github.kaitoy.sneo.network.SendPacketException; public class SneoUdpTransportMapping extends UdpTransportMapping { private static final int MAX_INBOUND_MESSAGE_SIZE = 65536; //TODO RealNetworkInterface private volatile Node node; public SneoUdpTransportMapping(UdpAddress udpAddress) { super(udpAddress); maxInboundMessageSize = MAX_INBOUND_MESSAGE_SIZE; } public void setNode(Node node) { this.node = node; } public boolean isListening() { return true; } @Deprecated @Override public void listen() throws IOException {} @Deprecated @Override public void close() throws IOException {} @Override public void sendMessage(Address address, byte[] message) throws IOException { if (!(address instanceof UdpAddress)) { throw new IllegalArgumentException(); } try { node.sendSnmpMessage( ((UdpAddress)address).getInetAddress(), ((UdpAddress)address).getPort(), message ); } catch (SendPacketException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } public void processMessage(Packet packet) { UdpPacket udpPacket = packet.get(UdpPacket.class); byte[] snmpMessage = udpPacket.getPayload().getRawData(); InetAddress srcAddr; IpV4Packet ipV4Packet = packet.get(IpV4Packet.class); if (ipV4Packet != null) { srcAddr = ipV4Packet.getHeader().getSrcAddr(); } else { srcAddr = packet.get(IpV6Packet.class).getHeader().getSrcAddr(); } int srcPort = udpPacket.getHeader().getSrcPort().value() & 0xFFFF; ByteBuffer bis; if (isAsyncMsgProcessingSupported()) { byte[] rawData = new byte[snmpMessage.length]; System.arraycopy(snmpMessage, 0, rawData, 0, rawData.length); bis = ByteBuffer.wrap(rawData); } else { bis = ByteBuffer.wrap(snmpMessage); } fireProcessMessage( new UdpAddress(srcAddr, srcPort), bis ); } }