/*
** This file is part of Filius, a network construction and simulation software.
**
** Originally created at the University of Siegen, Institute "Didactics of
** Informatics and E-Learning" by a students' project group:
** members (2006-2007):
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
** supervisors:
** Stefan Freischlad (maintainer until 2009), Peer Stechert
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
** and Stefan Freischlad
** Filius is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 2 of the License, or
** (at your option) version 3.
**
** Filius is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
** PURPOSE. See the GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Filius. If not, see <http://www.gnu.org/licenses/>.
*/
package filius.software.firewall;
import java.util.LinkedList;
import filius.Main;
import filius.hardware.NetzwerkInterface;
import filius.software.ProtokollThread;
import filius.software.netzzugangsschicht.EthernetFrame;
import filius.software.vermittlungsschicht.IpPaket;
/*
* @author Weyer
* Die Klasse schiebt sich zwischen die Ethernetschicht und die Vermittlungsschicht. Sie
* tauscht den Ip-Pakete-Puffer aus, sodass sie nach Regeln selektieren kann, welche Pakete
* als gueltig weitergeleitet werden
*/
public class FirewallThread extends ProtokollThread {
private LinkedList<EthernetFrame> ausgangsPuffer;
private Firewall firewall;
private NetzwerkInterface netzwerkInterface = null;
public NetzwerkInterface getNetzwerkInterface() {
return netzwerkInterface;
}
public FirewallThread(Firewall firewall, NetzwerkInterface nic) {
super(new LinkedList<EthernetFrame>());
Main.debug.println("INVOKED-2 ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (FirewallThread), constr: FirewallThread("+firewall+")");
this.firewall = firewall;
this.netzwerkInterface = nic;
}
/*
* tauscht den IP-Puffer zwischen Ethernetschicht und Vermittlungsschicht aus, und startet
* den Thread zur Überwachung des Datenaustausches
*/
public void starten(){
Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (FirewallThread), starten()");
LinkedList<EthernetFrame> eingangsPuffer;
super.starten();
this.ausgangsPuffer = netzwerkInterface.getPort().holeEingangsPuffer();
eingangsPuffer = (LinkedList<EthernetFrame>) holeEingangsPuffer();
netzwerkInterface.getPort().setzeEingangsPuffer(eingangsPuffer);
}
public void beenden() {
super.beenden();
netzwerkInterface.getPort().setzeEingangsPuffer(this.ausgangsPuffer);
}
//getter und setter:
@Override
protected void verarbeiteDatenEinheit(Object datenEinheit) {
Main.debug.println("INVOKED ("+this.hashCode()+", T"+this.getId()+") "+getClass()+" (FirewallThread), verarbeiteDatenEinheit("+datenEinheit.toString()+")");
IpPaket ipPaket = null;
EthernetFrame frame = (EthernetFrame) datenEinheit;
if (frame.getDaten() instanceof IpPaket) {
ipPaket = (IpPaket) frame.getDaten();
}
// Hier erfolgt nun die Abfrage, ob die Pakete laut Firewall in Ordnung sind:
//Bei false werden die Pakete weitergeleitet
//Am Ende in den Ausgangspuffer schreiben, und weiterreichen an EthernetThread
//oder nicht weiterleiten
if(ipPaket == null || !firewall.pruefePaketVerwerfen(ipPaket)){
synchronized(ausgangsPuffer){
//Main.debug.println("FirewallThread: Paket wurde von FirewallThread weitergeleitet");
ausgangsPuffer.add(frame);
ausgangsPuffer.notify();
}
}
}
}