|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 10240 (0x2800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Configuration_Testing, seg_002fe1
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
with Byte_Defs;
with Byte_String_Io;
with Log;
with Profile;
with Transport;
with Transport_Defs;
with Transport_Name;
--
-- The primary source for this package is maintained in
-- !!CLEM!TOOLS.NETWORKING.DEBUG
--
package body Configuration_Testing is
Digit : array (Byte_Defs.Byte range 0 .. 15) of Character :=
('0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
Failed : exception;
function "=" (Left, Right : Transport_Defs.Status_Code) return Boolean
renames Transport_Defs."=";
function "=" (Left, Right : Byte_Defs.Byte_String) return Boolean
renames Byte_Defs."=";
function "+" (Left, Right : Byte_Defs.Byte) return Byte_Defs.Byte
renames Byte_Defs."+";
function "*" (Left, Right : Byte_Defs.Byte) return Byte_Defs.Byte
renames Byte_Defs."*";
function "/" (Left, Right : Byte_Defs.Byte) return Byte_Defs.Byte
renames Byte_Defs."/";
function "mod" (Left, Right : Byte_Defs.Byte) return Byte_Defs.Byte
renames Byte_Defs."mod";
procedure Check (Status : Transport_Defs.Status_Code; From : String) is
begin
if Status /= Transport_Defs.Ok then
Log.Put_Line ("Transport." & From & ".Status = " &
Transport_Defs.Image (Status), Profile.Error_Msg);
raise Failed;
end if;
end Check;
function Max (Left, Right : Integer) return Integer is
begin
if Left > Right then
return Left;
else
return Right;
end if;
end Max;
function Hex_Image (A : Transport_Defs.Host_Id) return String is
S : String (1 .. 17) := "xx-xx-xx-xx-xx-xx";
Radix : constant := 16;
begin
for I in 0 .. Natural (A'Length) - 1 loop
S (S'First + (I * 3)) := Digit (A (A'First + I) / Radix);
S (S'First + (I * 3) + 1) := Digit (A (A'First + I) mod Radix);
end loop;
return S (1 .. (A'Length * 3) - 1);
end Hex_Image;
procedure Client (Server : String := "FF-FF-FF-FF-FF-FF";
Receipt : Byte_Defs.Byte_String := (0, 0);
Local : Transport_Defs.Host_Id :=
Transport.Local_Host (Configuration_Testing.Network);
Network : Transport_Defs.Network_Name :=
Configuration_Testing.Network;
Socket : Transport_Defs.Socket_Id :=
Configuration_Testing.Socket;
Max_Wait : Duration := 5.0) is
Remote : constant Transport_Defs.Host_Id :=
Transport_Name.Host_To_Host_Id (Server);
Connection : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Data : Byte_Defs.Byte_String (1 .. Max (48, 12 + Receipt'Length));
Count : Natural;
Skip : Natural;
Opcode : Natural;
Received : Natural := 0;
begin
Data (1 .. 2) := (0, 0); -- skip count
Data (3 .. 4) := (2, 0); -- opcode
Data (5 .. 10) := Byte_Defs.Byte_String (Local);
Data (11 .. 12) := (1, 0); -- next opcode
Data (13 .. 12 + Receipt'Length) := Receipt;
for Di in 13 + Receipt'Length .. Data'Last loop
Data (Di) := 0;
end loop;
Transport.Open (Connection, Status, Network, Socket);
Check (Status, "Open");
Transport.Connect (Connection, Status,
Remote_Host => Remote,
Remote_Socket => Socket);
Check (Status, "Connect(Active)");
Transport.Transmit (Connection, Status, Data, Count);
Check (Status, "Transmit");
if Count < Data'Length then
Log.Put_Line ("only" & Natural'Image (Count) &
" out of" & Natural'Image (Data'Length) &
" bytes were transmitted.", Profile.Warning_Msg);
end if;
loop
Transport.Receive (Connection, Status, Data, Count,
Max_Wait => Max_Wait);
exit when Status = Transport_Defs.Timed_Out and then Received > 0;
Check (Status, "Receive");
if Count >= 14 and then
Data (1 .. 2) = (8, 0) and then
Data (3 .. 4) = (2, 0) and then
Data (5 .. 10) = Byte_Defs.Byte_String (Local) and then
Data (11 .. 12) = (1, 0) and then
Data (13 .. 12 + Receipt'Length) = Receipt then
Log.Put_Line ("from " &
Hex_Image (Transport.Remote_Host (Connection)));
if Count < Data'Length then
Log.Put_Line ("only" & Natural'Image (Count) &
" bytes were received.", Profile.Warning_Msg);
end if;
Received := Received + 1;
else
Log.Put_Line ("from " &
Hex_Image (Transport.Remote_Host (Connection)) &
": " & Byte_String_Io.Image (Data (1 .. Count)),
Profile.Error_Msg);
end if;
end loop;
Transport.Close (Connection);
Log.Put_Line ("received" & Natural'Image (Received) & " responses.",
Profile.Positive_Msg);
exception
when Failed =>
Log.Put_Line ("Client failed", Profile.Negative_Msg);
Transport.Close (Connection);
end Client;
procedure Server (Network : Transport_Defs.Network_Name :=
Configuration_Testing.Network;
Socket : Transport_Defs.Socket_Id :=
Configuration_Testing.Socket) is
Connection : Transport.Connection_Id;
Status : Transport_Defs.Status_Code;
Data : Byte_Defs.Byte_String (1 .. 1500);
Count : Natural;
Skip : Natural;
Opcode : Natural;
Radix : constant := 256;
begin
Transport.Open (Connection, Status, Network, Socket);
Check (Status, "Open");
Transport.Connect (Connection, Status);
Check (Status, "Connect(Passive)");
loop
Transport.Receive (Connection, Status, Data, Count);
Check (Status, "Receive");
if Count >= 2 then
Skip := Natural (Data (1)) + (Radix * Natural (Data (2)));
if Count >= Skip + 4 then
Opcode := Natural (Data (Skip + 3)) +
(Radix * Natural (Data (Skip + 4)));
case Opcode is
when 1 => -- Reply
null;
when 2 => -- Forward Data
Transport.Connect
(Connection, Status,
Remote_Host =>
Transport_Defs.Host_Id
(Data (Skip + 5 .. Skip + 10)),
Remote_Socket => Socket);
Check (Status, "Connect(Active)");
Data (1 .. 2) :=
(Byte_Defs.Byte ((Skip + 8) mod Radix),
Byte_Defs.Byte ((Skip + 8) / Radix));
Transport.Transmit (Connection, Status,
Data (1 .. Count), Count);
Check (Status, "Transmit");
when others =>
null;
end case;
end if;
end if;
end loop;
Transport.Close (Connection);
exception
when Failed =>
Log.Put_Line ("Server failed", Profile.Negative_Msg);
Transport.Close (Connection);
end Server;
end Configuration_Testing;
nblk1=9
nid=0
hdr6=12
[0x00] rec0=1e rec1=00 rec2=01 rec3=03c
[0x01] rec0=1c rec1=00 rec2=02 rec3=06a
[0x02] rec0=15 rec1=00 rec2=03 rec3=006
[0x03] rec0=16 rec1=00 rec2=04 rec3=00e
[0x04] rec0=12 rec1=00 rec2=05 rec3=026
[0x05] rec0=17 rec1=00 rec2=06 rec3=022
[0x06] rec0=17 rec1=00 rec2=07 rec3=044
[0x07] rec0=15 rec1=00 rec2=08 rec3=01a
[0x08] rec0=06 rec1=00 rec2=09 rec3=000
tail 0x20f0013b6000806b6e1c5 0x42a00088462060003