/*_########################################################################## _## _## Copyright (C) 2011 Kaito Yamada _## _########################################################################## */ package com.github.kaitoy.sneo.network; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.pcap4j.packet.Packet; public class L2Connection extends PacketReceiver { private final List<PhysicalNetworkInterface> connectedNifs = Collections.synchronizedList(new ArrayList<PhysicalNetworkInterface>()); private L2Connection(String name) { super(name); } public static L2Connection connect( PhysicalNetworkInterface nif1, PhysicalNetworkInterface nif2 ) { L2Connection l2 = new L2Connection( L2Connection.class.getSimpleName() + "_" + nif1.getName() + "_" + nif2.getName() ); l2.connectedNifs.add(nif1); nif1.setSendPacketQueue(l2.getRecvPacketQueue()); l2.connectedNifs.add(nif2); nif2.setSendPacketQueue(l2.getRecvPacketQueue()); return l2; } public static L2Connection connect( String name, PhysicalNetworkInterface... nifs ) { L2Connection l2 = new L2Connection(name); for (PhysicalNetworkInterface nif: nifs) { l2.connectedNifs.add(nif); nif.setSendPacketQueue(l2.getRecvPacketQueue()); } return l2; } public void addConnection(PhysicalNetworkInterface nif) { connectedNifs.add(nif); nif.setSendPacketQueue(getRecvPacketQueue()); } @Override public void process(PacketContainer pc) { Packet packet = pc.getPacket(); if (logger.isDebugEnabled()) { StringBuilder sb = new StringBuilder(); sb.append("Received a packet from ") .append(pc.getSrc().getName()) .append(": ") .append(packet); logger.debug(sb.toString()); } NetworkInterface src = pc.getSrc(); for (PhysicalNetworkInterface nif: connectedNifs) { if (src != nif && nif.isRunning()) { boolean offered = nif.getRecvPacketQueue().offer(new PacketContainer(packet, null)); if (offered) { if (logger.isDebugEnabled()) { logger.debug("Sent a packet: " + packet); } } else { logger.error("Couldn't send a packet: " + packet); } } } } }