ironsides/udp_dns_package.adb.bk.4

66 lines
2.5 KiB
Groff

with Protected_SPARK_IO_05;
package body Udp_Dns_Package is
--type task_array is array(1..10) of udp_dns_task;
The_Task : Udp_Dns_Task;
--the_tasks : task_array;
Startup_Suspension : Ada.Synchronous_Task_Control.Suspension_Object;
procedure Initialization_Done is
begin
Ada.Synchronous_Task_Control.Set_True(Startup_Suspension);
end Initialization_Done;
------------------
-- Udp_Dns_Task --
------------------
task body Udp_Dns_Task is
Input_Packet : DNS_Types.DNS_Packet;
Input_Bytes : DNS_Types.Packet_Length_Range;
Reply_Address : DNS_Network.Network_Address_And_Port;
Output_Packet : DNS_Types.DNS_Packet;
Output_Bytes : DNS_Types.Packet_Length_Range;
Failure : Boolean;
begin
DNS_Network.Initialize_UDP;
Ada.Synchronous_Task_Control.Suspend_Until_True(Startup_Suspension);
Output_Packet.Bytes := DNS_Types.Bytes_Array_Type'(others => 0);
Output_Packet.Header := DNS_Types.Empty_Header;
loop
--# assert true;
DNS_Network_Receive.Receive_DNS_Packet(
Packet => Input_Packet,
Number_Bytes => Input_Bytes,
Reply_Address => Reply_Address,
Failure => Failure);
if Failure then
Protected_SPARK_IO_05.SPARK_IO_PO.Put_Line(
Protected_SPARK_IO_05.SPARK_IO_PO.Standard_Output,
"Receive failed",0);
else
Process_Dns_Request.Create_Response(
Input_Packet => Input_Packet,
Input_Bytes => Input_Bytes,
Output_Packet => Output_Packet,
Output_Bytes => Output_Bytes);
-- since there is a restriction on UDP messages w/o EDNS, cap the UDP size here
Output_Bytes := DNS_Types.Packet_Length_Range'Min(DNS_Types.UDP_Max_Size,Output_Bytes);
-- accept Flow, 10, Output_Packet, "don't really care that the packet is network ordered";
DNS_Network.Send_DNS_Packet(
Packet => Output_Packet,
Number_Bytes => Output_Bytes,
To_Address => Reply_Address,
Failure => Failure);
--end accept;
if Failure then
Protected_SPARK_IO_05.SPARK_IO_PO.Put_Line(
Protected_SPARK_IO_05.SPARK_IO_PO.Standard_Output,
"send failed",0);
end if;
end if;
end loop;
end Udp_Dns_Task;
end Udp_Dns_Package;