de.bsvrz.kex.tls.osi2osi3.osi3
Class TlsNetworkLayer

java.lang.Object
  extended by de.bsvrz.kex.tls.osi2osi3.osi3.TlsNetworkLayer
All Implemented Interfaces:
NetworkLayer, NetworkLayerSender

public class TlsNetworkLayer
extends Object
implements NetworkLayer, NetworkLayerSender

Implementierung der TLS-OSI-3 Netzwerkebene.

Author:
Kappich Systemberatung

Nested Class Summary
private  class TlsNetworkLayer.AsyncDataLinkLayerEventHandler
          Klasse zur Entkopplung von OSI2 und OSI7 beim Empfang von Daten.
private static class TlsNetworkLayer.ChannelObject
           
(package private) static class TlsNetworkLayer.LinkInfo
          Informationen von Verbindungen zwischen Geräten.
(package private) static class TlsNetworkLayer.RouteInfo
           
 
Field Summary
private  TlsNetworkLayer.AsyncDataLinkLayerEventHandler _asyncDataLinkLayerEventHandler
           
private static Debug _debug
           
private  Map _device2DirectRoutedDeviceListMap
           
private  Map _device2LinksMap
          Map, über die sich die von einem Gerät ausgehenden Verbindungen bestimmen lassen.
private  Map _device2RouteMap
           
 int _localDeviceAddress
           
private  Osi7LongTelegramRecombine _longTelegramCombiner
           
private  Osi7LongTelegramSegment _longTelegramSegmenter
           
private  LinkedList<NetworkLayerListener> _networkLayerListeners
           
private  TelegramProcessor _telegramProcessor
           
 
Fields inherited from interface de.bsvrz.kex.tls.osi2osi3.osi3.NetworkLayer
PRIORITY_CLASS_1, PRIORITY_CLASS_2
 
Constructor Summary
TlsNetworkLayer()
           
 
Method Summary
private  void addAllRoutedRemoteDevices(Integer device, Collection resultCollection)
           
private  void addDeviceLink(int device, int portAddress, DataLinkLayer linkLayer, DataLinkLayer.Link link, int remotePortAddress, int remoteDevice, boolean linkIsTransparent, boolean mirroredReceive, boolean dontIncrementOsi3Pointer)
           
 void addEventListener(NetworkLayerListener networkLayerListener)
          Meldet einen Empfänger für Ereignis der Netzebene an.
(package private)  void addLink(int device, int portAddress, DataLinkLayer linkLayer, DataLinkLayer.Link link, int remotePortAddress, int remoteDevice, boolean linkIsTransparent, boolean mirroredReceive, boolean dontIncrementOsi3Pointer)
           
 void completeInitialization()
          Suchalgorithmus zur Ermittlung aller möglichen Routen zu anderen Geräten.
private  TlsNetworkLayer.LinkInfo findLinkInfo(int device, int portAddress, int remotePortAdress, boolean resolveTransparentLinks)
          Sucht eine Verbindung ausgehend von einem vorgegebenen Gerät über ein bestimmtes Adressenpaar.
private  TlsNetworkLayer.LinkInfo findLinkInfo(int device, int portAddress, int remotePortAdress, boolean resolveTransparentLinks, int ignoreDevice)
          Sucht eine Verbindung ausgehend von einem vorgegebenen Gerät über ein bestimmtes Adressenpaar.
 DataLinkLayerListener getDataLinkLayerListener()
           
 int[] getRoutedRemoteDevices(int device)
          Bestimmt die Geräte, die über das angegebene Gerät erreichbar sind.
(package private)  TlsNetworkLayer.RouteInfo getRouteInfo(int device)
           
private  TlsNetworkLayer.RouteInfo getRouteInfo(Integer device)
           
 void handleDataLinkLayerEvent(DataLinkLayerEvent event)
          Wird aufgerufen, wenn ein Daten-Telegramm von der Osi2 Schnittstelle empfangen wird.
 boolean isReducingToControlByte(DataLinkLayer.Link link)
          Es wird geprüft ob die Option auf ReduzierungAufSteuerbyte aktiviert ist, d.h.
private  void notifyLongReceive(int sender, byte[] data)
          Weiterleitung eines empfangenen Langtelegramms an die Osi7 Schicht, falls es vollständig ist.
private  void notifyReceive(int sender, byte[] data)
          Weiterleitung eines empfangenen Telegramms an die Osi7-Schicht.
private  void notifyStateChange(int device, int state)
          Benachrichtigung der Osi7-Listener über die Änderung eines Verbindungsstatus
private  void putRemoteDevice(Integer device, Integer remoteDevice)
          Speichert zu einem Ausgangsgerät ein direkt an diesem angeschlossenes entferntes Gerät ab, das über das Gerät erreichbar ist, d.h.
private  void putRouteInfo(Integer device, TlsNetworkLayer.RouteInfo route)
           
 void removeEventListener(NetworkLayerListener networkLayerListener)
          Meldet einen angemeldeten Empfänger für Ereignisse der Netzebene wieder ab.
private  void sendData(DataLinkLayer.Link link, int priority, byte[] tlsOsi3Header, byte[] data)
           
 void sendData(int destination, byte[] data, boolean longTelegram)
          Sendet ein Telegramm mit hoher Priorität an ein vorgegebenes Zielgerät.
 void sendData(int destination, int priority, byte[] data, boolean longTelegram)
          Methode zum Versenden von Telegrammen mit vorgegebener Priorität
 void sendWithoutRedirection(int destination, int priority, byte[] data, boolean longTelegram)
           
(package private)  void setLocalDeviceAddress(int localDeviceAddress)
          Setzt die Knotennummer des lokalen Geräts.
 void setTelegramProcessor(TelegramProcessor telegramProcessor)
           
 void start()
          Startet die Verarbeitung von Telegrammen
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_debug

private static final Debug _debug

_localDeviceAddress

public int _localDeviceAddress

_networkLayerListeners

private final LinkedList<NetworkLayerListener> _networkLayerListeners

_device2RouteMap

private Map _device2RouteMap

_device2DirectRoutedDeviceListMap

private Map _device2DirectRoutedDeviceListMap

_asyncDataLinkLayerEventHandler

private final TlsNetworkLayer.AsyncDataLinkLayerEventHandler _asyncDataLinkLayerEventHandler

_longTelegramCombiner

private final Osi7LongTelegramRecombine _longTelegramCombiner

_longTelegramSegmenter

private Osi7LongTelegramSegment _longTelegramSegmenter

_device2LinksMap

private Map _device2LinksMap
Map, über die sich die von einem Gerät ausgehenden Verbindungen bestimmen lassen. Als Key der Map wird ein Integer-Objekt mit der Knotennummer des Geräts benutzt. Als Wert ist je Knoten ein List-Objekt mit LinkInfo-Objekten der Verbindungen enthalten.


_telegramProcessor

private TelegramProcessor _telegramProcessor
Constructor Detail

TlsNetworkLayer

public TlsNetworkLayer()
Method Detail

addEventListener

public void addEventListener(NetworkLayerListener networkLayerListener)
Description copied from interface: NetworkLayer
Meldet einen Empfänger für Ereignis der Netzebene an. Dies ist im allgemeinen eine Protokollschicht oberhalb der Netzebene (wie z.B. TLS-OSI-7 Schicht). Nach der Anmeldung werden allen angemeldeten Empfängern empfangene Telegramme und Statusänderung von Verbindungen mitgeteilt.

Specified by:
addEventListener in interface NetworkLayer
Parameters:
networkLayerListener - Anzumeldender Empfänger, der die Verarbeitung von empfangenen Telegrammen und Statusänderungen von Verbindungen übernimmt.

removeEventListener

public void removeEventListener(NetworkLayerListener networkLayerListener)
Description copied from interface: NetworkLayer
Meldet einen angemeldeten Empfänger für Ereignisse der Netzebene wieder ab.

Specified by:
removeEventListener in interface NetworkLayer
Parameters:
networkLayerListener - Abzumeldender Empfänger

getRoutedRemoteDevices

public int[] getRoutedRemoteDevices(int device)
Description copied from interface: NetworkLayer
Bestimmt die Geräte, die über das angegebene Gerät erreichbar sind. Alle Geräte, die bezüglich des OSI-3 Routings direkt oder indirekt hinter dem angegebenen Gerät liegen, werden ermittelt.

Specified by:
getRoutedRemoteDevices in interface NetworkLayer
Parameters:
device - Gerät zu dem die darüber erreichbaren Geräte ermittelt werden sollen.
Returns:
Array mit den Knotennummern der Geräte, die hinter dem angegebenen liegen.

addAllRoutedRemoteDevices

private void addAllRoutedRemoteDevices(Integer device,
                                       Collection resultCollection)

sendData

public void sendData(int destination,
                     byte[] data,
                     boolean longTelegram)
              throws DestinationUnreachableException
Description copied from interface: NetworkLayer
Sendet ein Telegramm mit hoher Priorität an ein vorgegebenes Zielgerät.

Specified by:
sendData in interface NetworkLayer
Parameters:
destination - Knotennummer des Geräts an das das Telegramm gesendet werden soll.
data - Nutzdaten aus Sicht des NetworkLayers (i.a. ein OSI-7 Telegrammblock).
longTelegram - true = Langtelegramm, das nicht der TLS Definition entspricht; false = Telegramm, das der TLS Definition entspricht
Throws:
DestinationUnreachableException - Wenn das angegebene Ziel nicht erreichbar ist.

sendData

public void sendData(int destination,
                     int priority,
                     byte[] data,
                     boolean longTelegram)
              throws DestinationUnreachableException
Methode zum Versenden von Telegrammen mit vorgegebener Priorität

Specified by:
sendData in interface NetworkLayer
Parameters:
destination - Knotennummer, an die gesendet werden soll
priority - Priorität, unter der das Telegramm versendet werden soll
data - Bytearray Telegrammdaten OSI7
longTelegram - true = Es soll ein Langtelegramm verschickt werden, das nicht der TLS-Norm entspricht
Throws:
DestinationUnreachableException

sendWithoutRedirection

public void sendWithoutRedirection(int destination,
                                   int priority,
                                   byte[] data,
                                   boolean longTelegram)
                            throws DestinationUnreachableException
Specified by:
sendWithoutRedirection in interface NetworkLayerSender
Throws:
DestinationUnreachableException

sendData

private void sendData(DataLinkLayer.Link link,
                      int priority,
                      byte[] tlsOsi3Header,
                      byte[] data)
               throws DestinationUnreachableException
Throws:
DestinationUnreachableException

start

public void start()
Description copied from interface: NetworkLayer
Startet die Verarbeitung von Telegrammen

Specified by:
start in interface NetworkLayer

getDataLinkLayerListener

public DataLinkLayerListener getDataLinkLayerListener()

notifyLongReceive

private void notifyLongReceive(int sender,
                               byte[] data)
Weiterleitung eines empfangenen Langtelegramms an die Osi7 Schicht, falls es vollständig ist.

Parameters:
sender - Absender des Telegramms
data - Telegramm/Nutzdaten für die Osi7 Schicht

notifyReceive

private void notifyReceive(int sender,
                           byte[] data)
Weiterleitung eines empfangenen Telegramms an die Osi7-Schicht.

Parameters:
sender - Absender des Telegramms
data - Telegramm/Nutzdaten für die Osi7 Schicht

notifyStateChange

private void notifyStateChange(int device,
                               int state)
Benachrichtigung der Osi7-Listener über die Änderung eines Verbindungsstatus

Parameters:
device - Zustandsänderung von diesem Gerät
state - Zustand der Verbindung. 0 steht für verbunden, sonst ist die Verbindung unterbrochen.

isReducingToControlByte

public boolean isReducingToControlByte(DataLinkLayer.Link link)
Es wird geprüft ob die Option auf ReduzierungAufSteuerbyte aktiviert ist, d.h. der Osi3-Header wird auf das Steuerbyte reduziert (Osi3-Routinginformationen entfernt) Falls keine Einstellung dafür vorhanden ist, wird das Telegram normal (mit Osi3-Routinginformationen) weitergeleitet.

Parameters:
link - Verbindung, von der die Einstellungen bezogen werden
Returns:
false: Osi3-Adressen werden nicht ignoriert
true: Osi3-Adressen werden ignoriert und werden bis auf das Steuerbyte entfernt.

handleDataLinkLayerEvent

public void handleDataLinkLayerEvent(DataLinkLayerEvent event)
Wird aufgerufen, wenn ein Daten-Telegramm von der Osi2 Schnittstelle empfangen wird.

Wenn das Telegramm keine Informationen über den Verbindungdstatus beinhaltet, wird das Telegram anhand des Osi3-Header-Information (Steuerbyte und Routinginformationen) ausgewertet und weitergeleitet.

Parameters:
event - Beinhaltet das Telegram und die verwendeten Schnittstellen-Informationen.

setLocalDeviceAddress

void setLocalDeviceAddress(int localDeviceAddress)
Setzt die Knotennummer des lokalen Geräts.

Parameters:
localDeviceAddress - Knotennummer des lokalen Geräts.

findLinkInfo

private TlsNetworkLayer.LinkInfo findLinkInfo(int device,
                                              int portAddress,
                                              int remotePortAdress,
                                              boolean resolveTransparentLinks)
Sucht eine Verbindung ausgehend von einem vorgegebenen Gerät über ein bestimmtes Adressenpaar.

Parameters:
device - Gerät von dem aus gesucht werden soll.
portAddress - Port-Adresse am Gerät von dem die gesuchte Verbindung ausgeht.
remotePortAdress - Port-Adresse des anderen Geräts an dem die gesuchte Verbindung ankommt.
resolveTransparentLinks - Flag, das gesetzt sein muss, wenn bei Verbindungen, die auf OSI-3 Ebene transparent sind, (also Verbindungen zu KRI) rekursiv weitergesucht werden soll.
Returns:
Gewünschtes LinkInfo Objekt oder null, wenn keine entsprechende Verbindung gefunden wurde.

findLinkInfo

private TlsNetworkLayer.LinkInfo findLinkInfo(int device,
                                              int portAddress,
                                              int remotePortAdress,
                                              boolean resolveTransparentLinks,
                                              int ignoreDevice)
Sucht eine Verbindung ausgehend von einem vorgegebenen Gerät über ein bestimmtes Adressenpaar.

Parameters:
device - Gerät von dem aus gesucht werden soll.
portAddress - Port-Adresse am Gerät von dem die gesuchte Verbindung ausgeht.
remotePortAdress - Port-Adresse des anderen Geräts an dem die gesuchte Verbindung ankommt.
resolveTransparentLinks - Flag, das gesetzt sein muss, wenn bei Verbindungen, die auf OSI-3 Ebene transparent sind, (also Verbindungen zu KRI) rekursiv weitergesucht werden soll.
ignoreDevice - Verbindungen zum angegebenen Gerät sollen bei der Suche ignoriert werden, um zyklische rekursive Aufrufe zu unterbinden.
Returns:
Gewünschtes LinkInfo Objekt oder null, wenn keine entsprechende Verbindung gefunden wurde.

addLink

void addLink(int device,
             int portAddress,
             DataLinkLayer linkLayer,
             DataLinkLayer.Link link,
             int remotePortAddress,
             int remoteDevice,
             boolean linkIsTransparent,
             boolean mirroredReceive,
             boolean dontIncrementOsi3Pointer)

addDeviceLink

private void addDeviceLink(int device,
                           int portAddress,
                           DataLinkLayer linkLayer,
                           DataLinkLayer.Link link,
                           int remotePortAddress,
                           int remoteDevice,
                           boolean linkIsTransparent,
                           boolean mirroredReceive,
                           boolean dontIncrementOsi3Pointer)

completeInitialization

public void completeInitialization()
Suchalgorithmus zur Ermittlung aller möglichen Routen zu anderen Geräten. Der Algorithmus arbeitet nicht rekursiv nach unten, sondern etagenweise (breadth-first-search) um bei einem Netz mit Maschen die jeweils kürzeste Route zu jedem erreichbaren anderen Knoten zu ermitteln. Ausgehend von einer Liste, die nur den lokalen Knoten enthält werden alle Knoten in spiralförmiger Weise iteriert und jeweils das Routing initialisiert und alle noch nicht bearbeiteten Geräte, die ausgehend vom jeweils bearbeiteten Gerät eine direkte Verbindung haben werden hinten an die Liste angehangen. Als erstes wird ein spezielles Routing für das lokale Gerät selbst eintragen, damit man auch Telegramme an sich selbst senden kann.


putRemoteDevice

private void putRemoteDevice(Integer device,
                             Integer remoteDevice)
Speichert zu einem Ausgangsgerät ein direkt an diesem angeschlossenes entferntes Gerät ab, das über das Gerät erreichbar ist, d.h. das Routing zum entfernten Gerät wird über das Ausgangsgerät führen.

Parameters:
device - Ausgangsgerät
remoteDevice - Entferntes Gerät

putRouteInfo

private void putRouteInfo(Integer device,
                          TlsNetworkLayer.RouteInfo route)

getRouteInfo

private TlsNetworkLayer.RouteInfo getRouteInfo(Integer device)

getRouteInfo

TlsNetworkLayer.RouteInfo getRouteInfo(int device)

setTelegramProcessor

public void setTelegramProcessor(TelegramProcessor telegramProcessor)