knx
ETS configurable knx-stack
network_layer_coupler.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdint.h>
4 #include "knx_types.h"
5 #include "npdu.h"
6 #include "transport_layer.h"
7 #include "network_layer_entity.h"
8 #include "network_layer.h"
9 
10 class DeviceObject;
11 class RouterObject;
12 
14 {
15  friend class NetworkLayerEntity;
16 
17  public:
19 
22 
23  bool isRoutedIndividualAddress(uint16_t individualAddress, uint8_t srcIfIndex);
24 
25  bool isRoutedGroupAddress(uint16_t groupAddress, uint8_t sourceInterfaceIndex);
26 
27  void rtObjPrimary(RouterObject& rtObjPrimary); // Coupler model 2.0
28  void rtObjSecondary(RouterObject& rtObjSecondary); // Coupler model 2.0
29  void rtObj(RouterObject& rtObj); // Coupler model 1.x
30 
31  // from transport layer
32  void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) override;
33  void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU& tpdu) override;
34  void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) override;
35  void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU& tpdu) override;
36 
37  private:
38  enum CouplerType
39  {
40  LineCoupler,
41  BackboneCoupler,
42  TP1Bridge,
43  TP1Repeater
44  };
45 
46  static constexpr uint8_t kPrimaryIfIndex = 0;
47  static constexpr uint8_t kSecondaryIfIndex = 1;
48  static constexpr uint8_t kLocalIfIndex = 99;
49 
50  // from entities
51  void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU& npdu,
52  Priority priority, uint16_t source, uint8_t srcIfIdx) override;
53  void dataConfirm(AckType ack, AddressType addrType, uint16_t destination, FrameFormat format, Priority priority,
54  uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx) override;
55  void broadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
56  Priority priority, uint16_t source, uint8_t srcIfIdx) override;
57  void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx) override;
58  void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU& npdu,
59  Priority priority, uint16_t source, uint8_t srcIfIdx) override;
60  void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU& npdu, bool status, uint8_t srcIfIdx) override;
61 
62  void routeDataIndividual(AckType ack, uint16_t destination, NPDU& npdu, Priority priority, uint16_t source, uint8_t srcIfIndex);
63  void sendMsgHopCount(AckType ack, AddressType addrType, uint16_t destination, NPDU& npdu, Priority priority,
64  SystemBroadcast broadcastType, uint8_t sourceInterfaceIndex, uint16_t source);
65 
66  void evaluateCouplerType();
67  bool isGroupAddressInFilterTable(uint16_t groupAddress);
68 #ifdef KNX_TUNNELING
69  bool isTunnelAddress(uint16_t destination);
70 #endif
71 
72  // Support a maximum of two physical interfaces for couplers
73  NetworkLayerEntity _netLayerEntities[2];
74 
75  RouterObject* _rtObjPrimary {nullptr};
76  RouterObject* _rtObjSecondary {nullptr};
77 
78  CouplerType _couplerType;
79  uint16_t _currentAddress;
80 };
Definition: npdu.h:9
NetworkLayerEntity & getSecondaryInterface()
void rtObjSecondary(RouterObject &rtObjSecondary)
void dataBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu) override
void dataGroupRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu) override
bool isRoutedIndividualAddress(uint16_t individualAddress, uint8_t srcIfIndex)
void rtObjPrimary(RouterObject &rtObjPrimary)
NetworkLayerCoupler(DeviceObject &deviceObj, TransportLayer &layer)
void rtObj(RouterObject &rtObj)
void dataSystemBroadcastRequest(AckType ack, HopCountType hopType, Priority priority, TPDU &tpdu) override
NetworkLayerEntity & getPrimaryInterface()
bool isRoutedGroupAddress(uint16_t groupAddress, uint8_t sourceInterfaceIndex)
void dataIndividualRequest(AckType ack, uint16_t destination, HopCountType hopType, Priority priority, TPDU &tpdu) override
void systemBroadcastIndication(AckType ack, FrameFormat format, NPDU &npdu, Priority priority, uint16_t source)
void dataConfirm(AckType ack, AddressType addressType, uint16_t destination, FrameFormat format, Priority priority, uint16_t source, NPDU &npdu, bool status)
void systemBroadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU &npdu, bool status)
void dataIndication(AckType ack, AddressType addType, uint16_t destination, FrameFormat format, NPDU &npdu, Priority priority, uint16_t source)
void broadcastConfirm(AckType ack, FrameFormat format, Priority priority, uint16_t source, NPDU &npdu, bool status)
void broadcastIndication(AckType ack, FrameFormat format, NPDU &npdu, Priority priority, uint16_t source)
Definition: tpdu.h:9
HopCountType
Definition: knx_types.h:124
Priority
Definition: knx_types.h:10
FrameFormat
Definition: knx_types.h:4
AckType
Definition: knx_types.h:18
AddressType
Definition: knx_types.h:33
SystemBroadcast
Definition: knx_types.h:112