Skip to content

Commit 486086c

Browse files
committed
Introduce EndpointAddress
1 parent 5ca6482 commit 486086c

24 files changed

+510
-347
lines changed

src/io/calimero/baos/ip/ObjectServerConnection.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343

4444
import java.io.IOException;
4545
import java.lang.System.Logger.Level;
46-
import java.net.InetAddress;
4746
import java.net.InetSocketAddress;
4847
import java.nio.ByteBuffer;
4948
import java.util.concurrent.CompletableFuture;
@@ -64,8 +63,10 @@
6463
import io.calimero.baos.BaosService.Property;
6564
import io.calimero.cemi.CEMI;
6665
import io.calimero.knxnetip.ClientConnection;
66+
import io.calimero.knxnetip.EndpointAddress;
6767
import io.calimero.knxnetip.KNXConnectionClosedException;
6868
import io.calimero.knxnetip.TcpConnection;
69+
import io.calimero.knxnetip.UdpEndpointAddress;
6970
import io.calimero.knxnetip.servicetype.ErrorCodes;
7071
import io.calimero.knxnetip.servicetype.KNXnetIPHeader;
7172
import io.calimero.knxnetip.servicetype.PacketHelper;
@@ -94,24 +95,22 @@ default void frameReceived(final FrameEvent e) {}
9495
// client SHALL wait 1 second for acknowledgment response to an object server request from server
9596
private static final int ReqTimeout = 1;
9697

97-
private final boolean tcp;
9898
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
9999
private final Future<?> keepAlive;
100100

101101

102102
ObjectServerConnection(final InetSocketAddress localEP, final InetSocketAddress serverCtrlEP)
103103
throws KNXException, InterruptedException {
104104
super(KNXnetIPHeader.ObjectServerRequest, KNXnetIPHeader.ObjectServerAck, 2, ReqTimeout);
105-
tcp = false;
106105
keepAlive = CompletableFuture.completedFuture(Void.TYPE);
107-
connect(localEP, serverCtrlEP, CRI.createRequest(ObjectServerProtocol), false);
106+
connect(new UdpEndpointAddress(localEP), new UdpEndpointAddress(serverCtrlEP), CRI.createRequest(ObjectServerProtocol), false);
108107
}
109108

110109
ObjectServerConnection(final TcpConnection c) throws KNXException {
111110
super(KNXnetIPHeader.ObjectServerRequest, KNXnetIPHeader.ObjectServerAck, 1, ReqTimeout, c);
112-
ctrlEndpt = c.server();
111+
ctrlEp(c.server());
112+
dataEp(c.server());
113113
logger = LogService.getLogger("io.calimero.baos." + name());
114-
tcp = true;
115114
try {
116115
c.connect();
117116
}
@@ -144,12 +143,13 @@ public void send(final BaosService svc, final BlockingMode mode) throws KNXConne
144143
if (mode == BlockingMode.WaitForCon)
145144
throw new KNXIllegalArgumentException(mode + " is not supported");
146145
try {
147-
final int chid = tcp ? 0 : channelId;
148-
final int seq = tcp ? 0 : getSeqSend();
146+
final boolean udp = ctrlEp() instanceof UdpEndpointAddress;
147+
final int chid = udp ? channelId : 0;
148+
final int seq = udp ? getSeqSend() : 0;
149149
final var buf = PacketHelper.toPacket(new ServiceRequest<>(serviceRequest, chid, seq, svc));
150150

151151
// NYI udp: we need a send method like for cEMI
152-
send(buf, dataEndpt);
152+
send(buf, dataEp());
153153
}
154154
catch (final IOException e) {
155155
close(CloseEvent.INTERNAL, "communication failure", ERROR, e);
@@ -164,8 +164,8 @@ public String name() {
164164

165165
@Override
166166
protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, final int offset,
167-
final InetAddress src, final int port) throws KNXFormatException, IOException {
168-
if (super.handleServiceType(h, data, offset, src, port))
167+
final EndpointAddress src) throws KNXFormatException, IOException {
168+
if (super.handleServiceType(h, data, offset, src))
169169
return true;
170170
final int svc = h.getServiceType();
171171
if (svc < serviceRequest || svc > serviceAck)
@@ -185,7 +185,7 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
185185
return true;
186186

187187
// req sequence and ack is only used over udp connections, not tcp
188-
if (!tcp) {
188+
if (ctrlEp() instanceof UdpEndpointAddress) {
189189
final int seq = req.getSequenceNumber();
190190
final boolean expected = seq == getSeqRcv();
191191
final boolean repeated = ((seq + 1) & 0xFF) == getSeqRcv();
@@ -195,7 +195,7 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
195195
final int status = h.getVersion() == ProtocolVersion ? ErrorCodes.NO_ERROR
196196
: ErrorCodes.VERSION_NOT_SUPPORTED;
197197
final byte[] buf = PacketHelper.toPacket(new ServiceAck(serviceAck, channelId, seq, status));
198-
send(buf, dataEndpt);
198+
send(buf, dataEp());
199199
if (status == ErrorCodes.VERSION_NOT_SUPPORTED) {
200200
close(CloseEvent.INTERNAL, "protocol version changed", ERROR, null);
201201
return true;
@@ -230,14 +230,14 @@ protected boolean handleServiceType(final KNXnetIPHeader h, final byte[] data, f
230230

231231
@Override
232232
protected void close(final int initiator, final String reason, final Level level, final Throwable t) {
233-
if (tcp) {
233+
if (ctrlEp() instanceof UdpEndpointAddress)
234+
super.close(initiator, reason, level, t);
235+
else {
234236
// closing = 2; // XXX needed?
235237
cleanup(initiator, reason, level, t);
236238
keepAlive.cancel(true);
237239
scheduler.shutdown();
238240
}
239-
else
240-
super.close(initiator, reason, level, t);
241241
}
242242

243243
@Override

0 commit comments

Comments
 (0)