public class TlsNetworkLayer extends java.lang.Object implements NetworkLayer, NetworkLayerSender
Implementierung der TLS-OSI-3 Netzwerkebene.
Modifier and Type | Class and Description |
---|---|
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 |
Modifier and Type | Field and Description |
---|---|
private TlsNetworkLayer.AsyncDataLinkLayerEventHandler |
_asyncDataLinkLayerEventHandler |
private static Debug |
_debug |
private java.util.Map |
_device2DirectRoutedDeviceListMap |
private java.util.Map |
_device2LinksMap
Map, über die sich die von einem Gerät ausgehenden Verbindungen bestimmen lassen.
|
private java.util.Map |
_device2RouteMap |
int |
_localDeviceAddress |
private Osi7LongTelegramRecombine |
_longTelegramCombiner |
private Osi7LongTelegramSegment |
_longTelegramSegmenter |
private java.util.LinkedList<NetworkLayerListener> |
_networkLayerListeners |
private TelegramProcessor |
_telegramProcessor |
PRIORITY_CLASS_1, PRIORITY_CLASS_2
Constructor and Description |
---|
TlsNetworkLayer() |
Modifier and Type | Method and Description |
---|---|
private void |
addAllRoutedRemoteDevices(java.lang.Integer device,
java.util.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(java.lang.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. 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.
|
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(java.lang.Integer device,
java.lang.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.
|
private void |
putRouteInfo(java.lang.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
|
private static final Debug _debug
public int _localDeviceAddress
private final java.util.LinkedList<NetworkLayerListener> _networkLayerListeners
private java.util.Map _device2RouteMap
private java.util.Map _device2DirectRoutedDeviceListMap
private final TlsNetworkLayer.AsyncDataLinkLayerEventHandler _asyncDataLinkLayerEventHandler
private final Osi7LongTelegramRecombine _longTelegramCombiner
private Osi7LongTelegramSegment _longTelegramSegmenter
private java.util.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.
private TelegramProcessor _telegramProcessor
public void addEventListener(NetworkLayerListener networkLayerListener)
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.
addEventListener
in interface NetworkLayer
networkLayerListener
- Anzumeldender Empfänger, der die Verarbeitung von empfangenen Telegrammen und Statusänderungen von Verbindungen übernimmt.public void removeEventListener(NetworkLayerListener networkLayerListener)
NetworkLayer
Meldet einen angemeldeten Empfänger für Ereignisse der Netzebene wieder ab.
removeEventListener
in interface NetworkLayer
networkLayerListener
- Abzumeldender Empfängerpublic int[] getRoutedRemoteDevices(int device)
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.
getRoutedRemoteDevices
in interface NetworkLayer
device
- Gerät zu dem die darüber erreichbaren Geräte ermittelt werden sollen.private void addAllRoutedRemoteDevices(java.lang.Integer device, java.util.Collection resultCollection)
public void sendData(int destination, byte[] data, boolean longTelegram) throws DestinationUnreachableException
NetworkLayer
Sendet ein Telegramm mit hoher Priorität an ein vorgegebenes Zielgerät.
sendData
in interface NetworkLayer
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 entsprichtDestinationUnreachableException
- Wenn das angegebene Ziel nicht erreichbar ist.public void sendData(int destination, int priority, byte[] data, boolean longTelegram) throws DestinationUnreachableException
Methode zum Versenden von Telegrammen mit vorgegebener Priorität
sendData
in interface NetworkLayer
destination
- Knotennummer, an die gesendet werden sollpriority
- Priorität, unter der das Telegramm versendet werden solldata
- Bytearray Telegrammdaten OSI7longTelegram
- true = Es soll ein Langtelegramm verschickt werden, das nicht der TLS-Norm entsprichtDestinationUnreachableException
public void sendWithoutRedirection(int destination, int priority, byte[] data, boolean longTelegram) throws DestinationUnreachableException
sendWithoutRedirection
in interface NetworkLayerSender
DestinationUnreachableException
private void sendData(DataLinkLayer.Link link, int priority, byte[] tlsOsi3Header, byte[] data) throws DestinationUnreachableException
DestinationUnreachableException
public void start()
NetworkLayer
Startet die Verarbeitung von Telegrammen
start
in interface NetworkLayer
public DataLinkLayerListener getDataLinkLayerListener()
private void notifyLongReceive(int sender, byte[] data)
Weiterleitung eines empfangenen Langtelegramms an die Osi7 Schicht, falls es vollständig ist.
sender
- Absender des Telegrammsdata
- Telegramm/Nutzdaten für die Osi7 Schichtprivate void notifyReceive(int sender, byte[] data)
Weiterleitung eines empfangenen Telegramms an die Osi7-Schicht.
sender
- Absender des Telegrammsdata
- Telegramm/Nutzdaten für die Osi7 Schichtprivate void notifyStateChange(int device, int state)
Benachrichtigung der Osi7-Listener über die Änderung eines Verbindungsstatus
device
- Zustandsänderung von diesem Gerätstate
- Zustand der Verbindung. 0 steht für verbunden, sonst ist die Verbindung unterbrochen.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.
link
- Verbindung, von der die Einstellungen bezogen werdenfalse
: Osi3-Adressen werden nicht ignoriert true
: Osi3-Adressen werden ignoriert und werden bis auf das Steuerbyte entfernt.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.
event
- Beinhaltet das Telegram und die verwendeten Schnittstellen-Informationen.void setLocalDeviceAddress(int localDeviceAddress)
Setzt die Knotennummer des lokalen Geräts.
localDeviceAddress
- Knotennummer des lokalen Geräts.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.
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.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.
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.void addLink(int device, int portAddress, DataLinkLayer linkLayer, DataLinkLayer.Link link, int remotePortAddress, int remoteDevice, boolean linkIsTransparent, boolean mirroredReceive, boolean dontIncrementOsi3Pointer)
private void addDeviceLink(int device, int portAddress, DataLinkLayer linkLayer, DataLinkLayer.Link link, int remotePortAddress, int remoteDevice, boolean linkIsTransparent, boolean mirroredReceive, boolean dontIncrementOsi3Pointer)
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.
private void putRemoteDevice(java.lang.Integer device, java.lang.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.
device
- AusgangsgerätremoteDevice
- Entferntes Gerätprivate void putRouteInfo(java.lang.Integer device, TlsNetworkLayer.RouteInfo route)
private TlsNetworkLayer.RouteInfo getRouteInfo(java.lang.Integer device)
TlsNetworkLayer.RouteInfo getRouteInfo(int device)
public void setTelegramProcessor(TelegramProcessor telegramProcessor)