fix(ab-transport): RegisterSession carries a zero sender context (found by Task 17 controllogix)
ab_server's RegisterSession sanity check rejects any non-zero sender context with encapsulation status 1 and a header-only reply, so every native session against the simulator failed with BadCommunicationError. libplctag sends zero (logix-register-session.hex); the codec test now matches that capture byte for byte instead of excluding the context, and a client test pins the zero on the wire.
This commit is contained in:
+10
@@ -32,6 +32,16 @@ public sealed class EncapsulationClientTests
|
||||
FakeEipServer.Command(server.Received[0]).ShouldBe(EncapCommand.RegisterSession);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RegisterSession_goes_on_the_wire_with_a_zero_sender_context()
|
||||
{
|
||||
// ab_server refuses RegisterSession with any non-zero sender context (status 1, header-only
|
||||
// reply), so the client must not stamp its per-request context on it. Found by Task 17.
|
||||
await using var server = new FakeEipServer();
|
||||
await using var client = await Connect(server);
|
||||
EncapsulationCodec.ReadHeader(server.Received[0]).SenderContext.ShouldBe(0UL);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SendRRData_returns_cip_payload()
|
||||
{
|
||||
|
||||
+6
-7
@@ -10,8 +10,8 @@ public sealed class EncapsulationCodecTests
|
||||
|
||||
[Fact]
|
||||
public void RegisterSession_frame_is_byte_exact() =>
|
||||
Convert.ToHexString(EncapsulationCodec.RegisterSession(Ctx)).ShouldBe(
|
||||
"6500" + "0400" + "00000000" + "00000000" + "0102030405060708" + "00000000" + "0100" + "0000");
|
||||
Convert.ToHexString(EncapsulationCodec.RegisterSession()).ShouldBe(
|
||||
"6500" + "0400" + "00000000" + "00000000" + "0000000000000000" + "00000000" + "0100" + "0000");
|
||||
|
||||
[Fact]
|
||||
public void UnRegisterSession_frame_is_header_only() =>
|
||||
@@ -43,13 +43,12 @@ public sealed class EncapsulationCodecTests
|
||||
.Status.ShouldBe(AbStatus.TooLarge);
|
||||
|
||||
[Fact]
|
||||
public void RegisterSession_matches_libplctag_capture_except_context()
|
||||
public void RegisterSession_matches_libplctag_capture_byte_for_byte()
|
||||
{
|
||||
// Including the sender context: ab_server rejects a non-zero RegisterSession context with
|
||||
// encapsulation status 1 (found by Task 17 controllogix — every native session failed).
|
||||
var captured = CaptureFile.Load("logix-register-session.hex").First(f => f.FromClient).Bytes;
|
||||
var ours = EncapsulationCodec.RegisterSession(Ctx);
|
||||
ours.Length.ShouldBe(captured.Length);
|
||||
ours.AsSpan(0, 12).ToArray().ShouldBe(captured.AsSpan(0, 12).ToArray()); // cmd,len,session,status
|
||||
ours.AsSpan(20).ToArray().ShouldBe(captured.AsSpan(20).ToArray()); // options + data
|
||||
Convert.ToHexString(EncapsulationCodec.RegisterSession()).ShouldBe(Convert.ToHexString(captured));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
Reference in New Issue
Block a user