knx
ETS configurable knx-stack
network_layer_device.cpp
Go to the documentation of this file.
1 #include "network_layer_device.h"
2 #include "device_object.h"
3 #include "tpdu.h"
4 #include "cemi_frame.h"
5 #include "bits.h"
6 
8  NetworkLayer(deviceObj, layer),
9  _netLayerEntities { {*this, kInterfaceIndex} }
10 {
11 }
12 
14 {
15  return _netLayerEntities[kInterfaceIndex];
16 }
17 
18 void NetworkLayerDevice::dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu)
19 {
20  NPDU& npdu = tpdu.frame().npdu();
21 
22  if (hopType == UnlimitedRouting)
23  npdu.hopCount(7);
24  else
25  npdu.hopCount(hopCount());
26 
27  //if (tpdu.apdu().length() > 0)
28  //{
29  // print.print("-> NL ");
30  // tpdu.apdu().printPDU();
31  //}
32  _netLayerEntities[kInterfaceIndex].sendDataRequest(npdu, ack, destination, _deviceObj.individualAddress(), priority, IndividualAddress, Broadcast);
33 }
34 
35 void NetworkLayerDevice::dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu)
36 {
37  NPDU& npdu = tpdu.frame().npdu();
38 
39  if (hopType == UnlimitedRouting)
40  npdu.hopCount(7);
41  else
42  npdu.hopCount(hopCount());
43 
44  _netLayerEntities[kInterfaceIndex].sendDataRequest(npdu, ack, destination, _deviceObj.individualAddress(), priority, GroupAddress, Broadcast);
45 }
46 
48 {
49  NPDU& npdu = tpdu.frame().npdu();
50 
51  if (hopType == UnlimitedRouting)
52  npdu.hopCount(7);
53  else
54  npdu.hopCount(hopCount());
55 
56  _netLayerEntities[kInterfaceIndex].sendDataRequest(npdu, ack, 0, _deviceObj.individualAddress(), priority, GroupAddress, Broadcast);
57 }
58 
60 {
61  // for closed media like TP1 and IP
62  bool isClosedMedium = (_netLayerEntities[kInterfaceIndex].mediumType() == DptMedium::KNX_TP1) || (_netLayerEntities[kInterfaceIndex].mediumType() == DptMedium::KNX_IP);
63  SystemBroadcast broadcastType = (isClosedMedium && isApciSystemBroadcast(tpdu.apdu()) ? Broadcast : SysBroadcast);
64 
65  NPDU& npdu = tpdu.frame().npdu();
66 
67  if (hopType == UnlimitedRouting)
68  npdu.hopCount(7);
69  else
70  npdu.hopCount(hopCount());
71 
72  _netLayerEntities[kInterfaceIndex].sendDataRequest(npdu, ack, 0, _deviceObj.individualAddress(), priority, GroupAddress, broadcastType);
73 }
74 
75 void NetworkLayerDevice::dataIndication(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source, uint8_t srcIfIdx)
76 {
78 
79  if (addrType == IndividualAddress)
80  {
81  if (destination != _deviceObj.individualAddress())
82  return;
83 
84  _transportLayer.dataIndividualIndication(destination, hopType, priority, source, npdu.tpdu());
85  return;
86  }
87 
88  // group-address type
89  if (destination != 0)
90  {
91  _transportLayer.dataGroupIndication(destination, hopType, priority, source, npdu.tpdu());
92  return;
93  }
94 }
95 
96 void NetworkLayerDevice::dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx)
97 {
99 
100  if (addressType == IndividualAddress)
101  {
102  _transportLayer.dataIndividualConfirm(ack, destination, hopType, priority, npdu.tpdu(), status);
103  return;
104  }
105 
106  // group-address type
107  if (destination != 0)
108  {
109  _transportLayer.dataGroupConfirm(ack, source, destination, hopType, priority, npdu.tpdu(), status);
110  return;
111  }
112 }
113 
114 void NetworkLayerDevice::broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source, uint8_t srcIfIdx)
115 {
117  DptMedium mediumType = _netLayerEntities[srcIfIdx].mediumType();
118 
119  // for closed media like TP1 and IP there is no system broadcast
120  // however we must be able to access those APCI via broadcast mode
121  // so we "translate" it to system broadcast like a coupler does when routing
122  // between closed and open media
123  if ( ((mediumType == DptMedium::KNX_TP1) || (mediumType == DptMedium::KNX_IP)) &&
124  isApciSystemBroadcast(npdu.tpdu().apdu()))
125  {
127  _transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
128  return;
129  }
130 
131  _transportLayer.dataBroadcastIndication(hopType, priority, source, npdu.tpdu());
132 }
133 
134 void NetworkLayerDevice::broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx)
135 {
137  _transportLayer.dataBroadcastConfirm(ack, hopType, priority, npdu.tpdu(), status);
138 }
139 
140 void NetworkLayerDevice::systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu, Priority priority, uint16_t source, uint8_t srcIfIdx)
141 {
143  _transportLayer.dataSystemBroadcastIndication(hopType, priority, source, npdu.tpdu());
144 }
145 
146 void NetworkLayerDevice::systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx)
147 {
149  _transportLayer.dataSystemBroadcastConfirm(ack, hopType, npdu.tpdu(), priority, status);
150 }
SystemBroadcast systemBroadcast() const
Definition: cemi_frame.cpp:237
NPDU & npdu()
Definition: cemi_frame.cpp:357
uint16_t individualAddress()
Definition: npdu.h:9
TPDU & tpdu()
Definition: npdu.cpp:41
CemiFrame & frame()
Definition: npdu.cpp:36
uint8_t hopCount() const
Definition: npdu.cpp:26
void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu) override
NetworkLayerEntity & getInterface()
void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu) override
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu) override
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu) override
NetworkLayerDevice(DeviceObject &deviceObj, TransportLayer &layer)
DptMedium mediumType() const
DeviceObject & _deviceObj
Definition: network_layer.h:29
uint8_t hopCount() const
bool isApciSystemBroadcast(APDU &apdu)
TransportLayer & _transportLayer
Definition: network_layer.h:30
Definition: tpdu.h:9
APDU & apdu()
Definition: tpdu.cpp:111
CemiFrame & frame()
Definition: tpdu.cpp:116
void dataGroupIndication(uint16_t destination, HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataSystemBroadcastConfirm(AckType ack, HopCountType hopType, TPDU &tpdu, Priority priority, bool status)
void dataIndividualIndication(uint16_t destination, HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataIndividualConfirm(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
void dataGroupConfirm(AckType ack, uint16_t source, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
void dataSystemBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
void dataBroadcastConfirm(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu, bool status)
void dataBroadcastIndication(HopCountType hopType, Priority priority, uint16_t source, TPDU &tpdu)
HopCountType
Definition: knx_types.h:124
@ UnlimitedRouting
NPDU::hopCount is set to 7. This means that the frame never expires. This could be a problem if your ...
Definition: knx_types.h:125
@ NetworkLayerParameter
use NetworkLayer::hopCount as NPDU::hopCount
Definition: knx_types.h:126
Priority
Definition: knx_types.h:10
FrameFormat
Definition: knx_types.h:4
AckType
Definition: knx_types.h:18
DptMedium
Definition: knx_types.h:254
@ KNX_IP
Definition: knx_types.h:260
@ KNX_TP1
Definition: knx_types.h:257
AddressType
Definition: knx_types.h:33
@ GroupAddress
Definition: knx_types.h:35
@ IndividualAddress
Definition: knx_types.h:34
SystemBroadcast
Definition: knx_types.h:112
@ Broadcast
Definition: knx_types.h:114
@ SysBroadcast
Definition: knx_types.h:113