------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real-time scheduling analysis tool. -- This program provides services to automatically check schedulability and -- other performance criteria of real-time architecture models. -- -- Copyright (C) 2002-2020, Frank Singhoff, Alain Plantec, Jerome Legrand, -- Hai Nam Tran, Stephane Rubini -- -- The Cheddar project was started in 2002 by -- Frank Singhoff, Lab-STICC UMR 6285, Université de Bretagne Occidentale -- -- Cheddar has been published in the "Agence de Protection des Programmes/France" in 2008. -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- The full list of contributors and sponsors can be found in AUTHORS.txt and SPONSORS.txt -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ------------------------------------------------------------------------------ -- Last update : -- $Rev$ -- $Date$ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; with Ada.Strings; use Ada.Strings; with Ada.Strings.Fixed; use Ada.Strings.Fixed; with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random ; with unbounded_strings; use unbounded_strings; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with unbounded_strings; use unbounded_strings; with Ada.Strings; use Ada.Strings; with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO; with Ada.Directories; use Ada.Directories; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Unbounded_Strings; use Unbounded_Strings; with convert_unbounded_strings; use unbounded_strings.unbounded_string_list_package; use unbounded_strings.strings_table_package; with Ada.Strings; use Ada.Strings; with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO; with Ada.text_IO; use Ada.text_IO; with Ada.Integer_text_IO; use Ada.Integer_text_IO; with Ada.Float_Text_IO; use Ada.Float_Text_IO; with Dependencies; use Dependencies; with Task_Dependencies; use Task_Dependencies; with Task_Dependencies; use Task_Dependencies.Half_Dep_Set; with Message_Set ; use Message_Set; with Messages; use Messages; with Tasks; use Tasks; with Task_Set; use Task_Set; with Resources; use Resources; with Resource_Set; use Resource_Set; with convert_unbounded_strings; use unbounded_strings.unbounded_string_list_package; with Scheduler_Interface; use Scheduler_Interface; with Address_Spaces; use Address_Spaces; with Address_Space_Set; use Address_Space_Set; with Call_Framework; use Call_Framework; with Call_Framework_Interface; use Call_Framework_Interface; use Call_Framework_Interface.Framework_Response_Package; use Call_Framework_Interface.Framework_Request_Package; with Call_Scheduling_Framework; use Call_Scheduling_Framework; with Pipe_Commands; use Pipe_Commands; with Ada.Text_IO; use Ada.Text_IO; with Ada.Text_IO.Unbounded_IO; use Ada.Text_IO.Unbounded_IO; with Ada.Directories; use Ada.Directories; with GNAT.OS_Lib; use GNAT.OS_Lib; with Debug; use Debug; with Random_Tools; use Random_Tools; use unbounded_strings.strings_table_package; with architecture_factory; use architecture_factory; with Ada.Integer_text_IO; use Ada.Integer_text_IO; with Ada.Float_Text_IO; use Ada.Float_Text_IO; with Systems; use Systems; with Processors; use Processors; with Processor_Set; use Processor_Set; with processor_interface; use processor_interface; use Processor_Set.Generic_Processor_Set; with Core_Units; use Core_Units; use Core_Units.Core_Units_Table_Package; with natural_util; use natural_util; with feasibility_test.feasibility_interval; use feasibility_test.feasibility_interval; with Objective_Functions_and_Feasibility_Checks; use Objective_Functions_and_Feasibility_Checks; with integer_util; use integer_util; use Resources.Resource_Accesses; with float_util; use float_util; with Ada.Characters.Latin_1; use Ada.Characters; with Ada.Text_IO; use Ada.Text_IO; with GNAT.String_Split; use GNAT; with MILS_Security; use MILS_Security; with Random_Tools; use Random_Tools; with Memories; use Memories; package body Chromosome_Data_Manipulation is -------------- -- init_F2T -- -------------- procedure init_F2T is F : Ada.Text_IO.File_Type; gene_i : unbounded_String; gene_task_i : unbounded_String; gene_com_i : unbounded_String; chrom_str : unbounded_String; -- Subs is populated by the actual substrings. Subs : String_Split.Slice_Set; -- just an arbitrary simple set of whitespace. Seps : constant String := " " & Latin_1.HT; j, k : Integer; My_iterator: Tasks_Dependencies_Iterator; Dep_Ptr: Dependency_Ptr; My_dependencies: Tasks_Dependencies_Ptr; A_task_i : Generic_Task_Ptr; Sys1,Sys2, Sys3, Sys4, Sys5, Sys6, Sys7 : System; begin if Using_preprocessed_initial_sol then -- Initialize the current solution c with the preprocessed -- initial solution -- 1/ get the chromosome of the preprocessed initial solution -- from the file chrom_preprocessed_initial_solution.txt Open (File => F, Mode => Ada.Text_IO.In_File, Name => "chrom_preprocessed_initial_solution.txt"); loop exit when Ada.Text_IO.End_Of_File (F); Ada.Strings.Unbounded.Append (chrom_str, To_Unbounded_String(Get_Line (File => F))); end loop; close (F); Put_Debug ("chrom_str: " & To_string (chrom_str)); -- 2/ extract gene values from chrom_str to initialize the -- initial current solution -- The following code is inspired from: -- http://wiki.ada-dk.org/gnat.string_split_basic_usage_example String_Split.Create (S => Subs, From => To_String(chrom_str), Separators => Seps, Mode => String_Split.Multiple); for i in 1 .. genes loop c.chrom_task (i) := Integer'Value(String_Split.Slice (Subs, String_Split.Slice_Number(i+1))); end loop; Put ("The initial preprocessed solution: "); print_genome(c); else -- initialize the current solution c by puting all the tasks in the same partition -- solution -- nb_InitSol:=0; nb_NoFeasible_Sol := 0; for i in 1 .. genes loop c.chrom_task(i) := 1; sol_init1.chrom_task(i) := 1; if i <= genes/2 then sol_init2.chrom_task(i) := 1; else sol_init2.chrom_task(i) := 2; end if; A_task_i := Search_Task (Initial_System.Tasks, Suppress_Space (i'Img)) ; -- all tasks with the same confidentiality level should be put in the same partition if(A_task_i.mils_confidentiality_level= Top_Secret) then sol_init3.chrom_task(i):= 1; sol_init4.chrom_task(i):= 1; elsif (A_task_i.mils_confidentiality_level= Secret) then sol_init3.chrom_task(i):= 2; sol_init4.chrom_task(i):= 2; elsif (A_task_i.mils_confidentiality_level= Classified)then sol_init3.chrom_task(i):= 3; sol_init4.chrom_task(i):= 3; else sol_init3.chrom_task(i):= 4; sol_init4.chrom_task(i):= 4; end if; -- all tasks with the same integrity level should be put in the same partition if(A_task_i.mils_integrity_level= High) then sol_init5.chrom_task(i):= 1; sol_init6.chrom_task(i):= 1; elsif (A_task_i.mils_integrity_level= Medium) then sol_init5.chrom_task(i):= 2; sol_init6.chrom_task(i):= 2; else sol_init5.chrom_task(i):= 3; sol_init6.chrom_task(i):= 3; end if; -- if i <= genes/4 then -- sol_init2.chrom_task(i) := 1; -- elsif (i > genes/4) AND (i <= genes/2) then -- sol_init2.chrom_task(i) := 2; -- elsif (i > genes/2) AND (i <= 3*genes/4) then -- sol_init2.chrom_task(i) := 3; -- else -- sol_init2.chrom_task(i) := 4; -- end if; end loop; -- for i in 1..genes loop -- if i <= genes/2 then -- c.chrom_task(i) := 1; -- else -- c.chrom_task(i) := 2; -- end if; -- -- end loop; My_dependencies:= Initial_System.Dependencies; if is_empty( My_dependencies.Depends) then Put_Debug("No dependencies"); else j:= 1; k:= 1; reset_iterator(My_dependencies.Depends, My_iterator); loop current_element(My_dependencies.Depends, Dep_Ptr, My_iterator); if(Dep_Ptr.type_of_dependency=precedence_dependency)then if ( (Dep_Ptr.precedence_sink.mils_confidentiality_level=UnClassified)AND ((Dep_Ptr.precedence_source.mils_confidentiality_level= Secret)OR (Dep_Ptr.precedence_source.mils_confidentiality_level= Top_Secret)) ) OR ( (Dep_Ptr.precedence_source.mils_integrity_level= Low ) AND (( Dep_Ptr.precedence_sink.mils_integrity_level=Medium) OR ( Dep_Ptr.precedence_sink.mils_integrity_level=High)) )then -- Resolve confidentiality and integrity constraints problem c.chrom_com(j).mode := emission; c.chrom_com(j).link := communication; c.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init1.chrom_com(j).mode := emission; sol_init1.chrom_com(j).link := communication; sol_init1.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init2.chrom_com(j).mode := emission; sol_init2.chrom_com(j).link := communication; sol_init2.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init3.chrom_com(j).mode := emission; sol_init3.chrom_com(j).link := communication; sol_init3.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init4.chrom_com(j).mode := emission; sol_init4.chrom_com(j).link := communication; sol_init4.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init5.chrom_com(j).mode := emission; sol_init5.chrom_com(j).link := communication; sol_init5.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init6.chrom_com(j).mode := emission; sol_init6.chrom_com(j).link := communication; sol_init6.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); else if(Dep_Ptr.precedence_sink.mils_confidentiality_level< Dep_Ptr.precedence_source.mils_confidentiality_level) OR (Dep_Ptr.precedence_source.mils_integrity_level< Dep_Ptr.precedence_sink.mils_integrity_level)then -- resolve all security problems k := k+1; c.chrom_com(j).mode := emission; c.chrom_com(j).link := communication; c.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init4.chrom_com(j).mode := emission; sol_init4.chrom_com(j).link := communication; sol_init4.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init6.chrom_com(j).mode := emission; sol_init6.chrom_com(j).link := communication; sol_init6.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); else c.chrom_com(j).mode := noDW; c.chrom_com(j).link := noDW; c.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init4.chrom_com(j).mode := noDW; sol_init4.chrom_com(j).link := noDW; sol_init4.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init6.chrom_com(j).mode := noDW; sol_init6.chrom_com(j).link := noDW; sol_init6.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); end if; sol_init1.chrom_com(j).mode := noDW; sol_init1.chrom_com(j).link := noDW; sol_init1.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init2.chrom_com(j).mode := noDW; sol_init2.chrom_com(j).link := noDW; sol_init2.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init3.chrom_com(j).mode := noDW; sol_init3.chrom_com(j).link := noDW; sol_init3.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); sol_init5.chrom_com(j).mode := noDW; sol_init5.chrom_com(j).link := noDW; sol_init5.chrom_com(j).source_sink := suppress_space(To_String(Dep_Ptr.precedence_source.name) & "_" & To_String(Dep_Ptr.precedence_sink.name)); end if; j := j+1; end if; exit when is_last_element (My_Dependencies.Depends, My_Iterator); next_element (My_Dependencies.Depends, My_Iterator); end loop; end if; end if; normalize(sol_init3); normalize(sol_init4); normalize(sol_init5); normalize(sol_init6); Put_Debug("===============c================"); print_genome(c); Put_Debug("===============sol_init1================"); print_genome(sol_init1); Put_Debug("===============sol_init2================"); print_genome(sol_init2); Put_Debug("===============sol_init3================"); print_genome(sol_init3); Put_Debug("===============sol_init4================"); print_genome(sol_init4); Put_Debug("===============sol_init5================"); print_genome(sol_init5); Put_Debug("===============sol_init6================"); print_genome(sol_init6); If Check_Feasibility_of_A_Solution (sol_init1, 0) then Put_Debug("===============sol_init1 evaluation ================"); evaluate_F2T (sol_init1, 0); archive_soln(sol_init1); update_grid(sol_init1); Append (Data3, " 0" & " " & sol_init1.obj(1)'img &" " &sol_init1.obj(2)'img &" " & sol_init1.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol1" & " " & sol_init1.obj(1)'img &" " &sol_init1.obj(2)'img &" " & sol_init1.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys1, sol_init1); Transform_Chromosome_To_CheddarADL_Model(Sys1 ,sol_init1); Write_To_Xml_File (A_System => Sys1, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init1" & ".xmlv3")))); end if; If Check_Feasibility_of_A_Solution (sol_init2, 0) then Put_Debug("===============sol_init2 evaluation ================"); evaluate_F2T (sol_init2, 0); archive_soln(sol_init2); update_grid(sol_init2); Append (Data3, " 0" & " " & sol_init2.obj(1)'img &" " &sol_init2.obj(2)'img &" " & sol_init2.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol2" & " " & sol_init2.obj(1)'img &" " &sol_init2.obj(2)'img &" " & sol_init2.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys2, sol_init2); Transform_Chromosome_To_CheddarADL_Model(Sys2 ,sol_init2); Write_To_Xml_File (A_System => Sys2, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init2" & ".xmlv3")))); end if; If Check_Feasibility_of_A_Solution (sol_init3, 0) then Put_Debug("===============sol_init3 evaluation ================"); evaluate_F2T (sol_init3, 0); archive_soln(sol_init3); update_grid(sol_init3); Append (Data3, " 0" & " " & sol_init3.obj(1)'img &" " &sol_init3.obj(2)'img &" " & sol_init3.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol3" & " " & sol_init3.obj(1)'img &" " &sol_init3.obj(2)'img &" " & sol_init3.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys3, sol_init3); Transform_Chromosome_To_CheddarADL_Model(Sys3 ,sol_init3); Write_To_Xml_File (A_System => Sys3, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init3" & ".xmlv3")))); end if; If Check_Feasibility_of_A_Solution (sol_init4, 0) then Put_Debug("===============sol_init4 evaluation ================"); evaluate_F2T (sol_init4, 0); archive_soln(sol_init4); update_grid(sol_init4); Append (Data3, " 0" & " " & sol_init4.obj(1)'img &" " &sol_init4.obj(2)'img &" " & sol_init4.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol4" & " " & sol_init4.obj(1)'img &" " &sol_init4.obj(2)'img &" " & sol_init4.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys4, sol_init4); Transform_Chromosome_To_CheddarADL_Model(Sys4 ,sol_init4); Write_To_Xml_File (A_System => Sys4, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init4" & ".xmlv3")))); end if; If Check_Feasibility_of_A_Solution (sol_init5, 0) then Put_Debug("===============sol_init5 evaluation ================"); evaluate_F2T (sol_init5, 0); archive_soln(sol_init5); update_grid(sol_init5); Append (Data3, " 0" & " " & sol_init5.obj(1)'img &" " &sol_init5.obj(2)'img &" " & sol_init5.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol5" & " " & sol_init5.obj(1)'img &" " &sol_init5.obj(2)'img &" " & sol_init5.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys5, sol_init5); Transform_Chromosome_To_CheddarADL_Model(Sys5 ,sol_init5); Write_To_Xml_File (A_System => Sys5, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init5" & ".xmlv3")))); end if; If Check_Feasibility_of_A_Solution (sol_init6, 0) then Put_Debug("===============sol_init6 evaluation ================"); evaluate_F2T (sol_init6, 0); archive_soln(sol_init6); update_grid(sol_init6); Append (Data3, " 0" & " " & sol_init6.obj(1)'img &" " &sol_init6.obj(2)'img &" " & sol_init6.obj(3)'img &" "& ASCII.LF); Put_Debug ("sol6" & " " & sol_init6.obj(1)'img &" " &sol_init6.obj(2)'img &" " & sol_init6.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys6, sol_init6); Transform_Chromosome_To_CheddarADL_Model(Sys6 ,sol_init6); Write_To_Xml_File (A_System => Sys6, File_Name => To_string (Suppress_Space (To_Unbounded_String ("sol_init6" & ".xmlv3")))); end if; -- If Check_Feasibility_of_A_Solution (One_to_one_mapping_solution, 0) then If Check_Feasibility_of_A_Solution (c, 0) then evaluate_F2T (c, 0); Put_Debug("===============c evaluation finish================"); if (Float'Value(c.obj(1)'img)=0.0) and (Float'Value(c.obj(2)'img)=0.0) and (Float'Value(c.obj(3)'img)=0.0) then Put_debug("MissedDeadlines" & c.obj(1)'img &" Bell " & c.obj(2)'img &" Biba " & c.obj(2)'img ); Put_Debug("Simple design: no need for optimization"); archive_soln(c); Create_system (Sys7, c); Transform_Chromosome_To_CheddarADL_Model(Sys7 ,c); Write_To_Xml_File (A_System => Sys7, File_Name => To_string (Suppress_Space (To_Unbounded_String ("c" & ".xmlv3")))); OS_Exit(0); else archive_soln(c); update_grid(c); Append (Data3, " 0" & " " & c.obj(1)'img &" " &c.obj(2)'img &" " & c.obj(3)'img &" "& ASCII.LF); nb_InitSol:=nb_InitSol+1; Create_system (Sys7, c); Transform_Chromosome_To_CheddarADL_Model(Sys7 ,c); Write_To_Xml_File (A_System => Sys7, File_Name => To_string (Suppress_Space (To_Unbounded_String ("c" & ".xmlv3")))); end if; else -- if c (that is supposed to be the first current solution) is non feasible if arclength>0 then -- if the archive is not empty c:=arc(1); --the first element of the archive becomes the first current solution else Put_Debug("All the initial solutions are non feasible"); return; end if; end if; end init_F2T; ---------------- -- mutate_F2T -- ---------------- procedure mutate_F2T (s : in out solution; eidx : in Natural) is random_partition, tn, x, cn, finish,sol_config : integer; -- DW_link: integer; A_system : System; A_Task_set, New_Task_set : Tasks_Set; -- Nb_partitions : integer; -- period_fn, period_j : natural; -- harmonic_tasks : chrom_type; counter : integer; -- is_harmonic, exist : boolean; Sol_is_mutated : boolean; A_sol : solution; -- Nb_harmonic_tasks : integer; G : Ada.Numerics.Float_Random.Generator; New_resource_set : Resources_Set; A_task_source : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; begin Create_system (A_system, s); sol_is_mutated := false; reset(G); -- Initialise the float generator -- genes_init := genes; -- I think, we should add a counter, if this counter reach a threashold -- and it failed to generate a mutated solution then we stop counter := 1; while (not sol_is_mutated) and (counter <= 100000) loop Put_Debug ("................................................................"); Put_Debug ("The " & counter'img & " attempt of the mutation procedure "); Put_Debug ("................................................................"); Put_Debug ("................................................................"); Put_Debug ("The " & counter'img & " attempt of the mutation procedure "); Put_Debug ("................................................................"); A_sol := s; -- Transform_Chromosome_To_CheddarADL_Model (A_system, A_sol); -- Nb_partitions := Number_of_partitions(A_sol); -- Nb_tasks := Number_of_tasks (A_sol); -- choose randomly an index of a task between 1 and genes tn := 0; while (tn > genes) or (tn < 1) loop tn := integer (float(genes) * random(G)); end loop; Put_Debug ("The randomly chosen task is : " & tn'img); random_partition := 0; -- generate a random number of partition comprised between 1 and nb_partitions -- reset(G); -- Initialise the float generator while (random_partition > nb_partitions) OR (random_partition < 1) loop random_partition := integer (float(nb_partitions) * random(G)); end loop; Put_Debug ("The randomly chosen partition is : " & random_partition'img); -- choose randomly the configuration to secure communications sol_config:=0; reset(G); -- Initialise the float generator while (sol_config > 2) or (sol_config < 1) loop sol_config := integer (2.0 * random(G)); end loop; A_sol.security_config:=sol_config; Put_Debug ("The chosen configuration is : " & sol_config'img); -- the task "tn" is not intially in the partition "random_partition" then "tn" is moved -- to the partition "random_partition" if (random_partition /= A_sol.chrom_task(tn)) then A_sol.chrom_task(tn) := random_partition; sol_is_mutated := true; -- elsif not (is_isolated (tn, A_sol)) then -- -- if coincidentally the task "tn" is initially in the task "random_partition" -- -- then if the task "tn" is not initially isolated, we create a new partition -- -- in which we isolate it -- A_sol.chrom_task(tn) := Nb_partitions + 1; -- sol_is_mutated := true; end if; -- Est ce qu'on doit supprimé l'ancienne partition si la tache était seule (tache isolée)??? -- communication mutation -- choose randomly an index of a task between 1 and genes_com x:=0; while (x > Nb_NonSecure_low) or (x < 1) loop x := Integer(float(Nb_NonSecure_low) * random(G)); end loop; cn := NonSecure_list(x); Put_Debug ("The randomly chosen communication is : " & cn'img); Put_Debug ("This chosen communication is : " & To_String(s.chrom_com(cn).source_sink)); finish := index(A_sol.chrom_com(cn).source_sink,"_"); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(cn).source_sink,1,finish-1))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(cn).source_sink,finish+1,Length(s.chrom_com(cn).source_sink)))); -- Put_Debug("A_task_source : "& To_String(A_task_source.name)); -- New_Line; -- Put_Debug("A_task_sink : "& To_String(A_task_sink.name)); if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) OR (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then if ((A_task_sink.mils_task/=Downgrader) AND (A_task_sink.mils_task/=Upgrader)AND (A_task_source.mils_task/=Downgrader)AND (A_task_source.mils_task/=Upgrader)) then if (A_sol.chrom_com(cn).mode = noDW) then -- add a downgrader and assign it to the partition of the task source of the communication -- genes := genes+1; -- -- task_source := Integer'Value (To_String (A_task_source.name)); -- A_sol.chrom_task(genes) := A_sol.chrom_task(task_source); -- A_sol.chrom_com(cn).mode := emission; -- DW at emission (we suppose that a DW should always be at the emission) -- DW linked to the communication A_sol.chrom_com(cn).link := communication; -- Choose randomly if the added Downgrader should be linked to -- task (DW_link = 1) -- or communication (DW_link = 2) -- or partition (DW_link = 3) -- DW_link := 0; -- -- while (DW_link > 3) or (DW_link < 1) loop -- DW_link := integer (float(3) * random(G)); -- end loop; -- -- if (DW_link = 1) then -- A_sol.chrom_com(cn).link := tsk; -- DW linked to the task -- elsif (DW_link = 2) then -- DW linked to the communication -- A_sol.chrom_com(cn).link := communication; -- elsif (DW_link = 3) then -- DW linked to the partition -- A_sol.chrom_com(cn).link := partition; -- end if; sol_is_mutated := true; -- elsif (A_sol.chrom_com(cn).mode = emission) or (A_sol.chrom_com(cn).mode = reception) then elsif ( A_sol.chrom_com(cn).link = communication) then A_sol.chrom_com(cn).mode := noDW; A_sol.chrom_com(cn).link := noDW; sol_is_mutated := true; end if; end if; end if; -- -- elsif (not is_isolated (tn, A_sol)) then -- -- if coincidentally the task "tn" is intially in the task "random_task" -- -- then if the task "tn" is not initially isolated, we create a new task -- -- in which we isolate it -- -- else i.e the function "fn" is alone then we repeat the procedure with another function -- -- chosen randomly -- A_sol.chrom(fn) := nb_tasks + 1; -- sol_is_mutated := true; -- end if; -- -- end if; if sol_is_mutated then Put_Debug(" "); Put_Debug ("The mutated solution is : "); print_debug_genome(A_sol); Put_Debug(" "); -- normalize the mutate solution normalize(A_sol); Put_Debug(" "); Put_Debug ("After normalization the candidate solution is : "); print_debug_genome(A_sol); Put_Debug(" "); -- After generating a mutate solution, we shoud verify -- if it is feasible else we must regenerate a new candidate solution: -- If Check_Feasibility_of_A_Solution (A_sol,eidx) then Put_Debug (" The candidate solution is feasible"); -- New_nb_tasks := Number_of_tasks (A_sol); sol_is_mutated := true; s := A_sol; else Put_Debug (" The candidate solution is NOt Feasible " & " we should regenerate another candidate solution"); sol_is_mutated := false; counter := counter + 1; nb_NoFeasible_Sol := nb_NoFeasible_Sol+1; -- genes := genes_init; end if; end if; end loop; if counter > 100000 then Put_Debug(" ");--New_Line; Put_Debug(" ");--New_Line; Put_Debug("Exit the program, there is no schedulable candidate solution !"); Put_Debug(" ");--New_Line; Put_Debug(" ");--New_Line; OS_Exit (0); end if; end mutate_F2T; procedure generate_next_element_F2T (s : in out solution; i, j : in out Integer) is begin if (i<=genes) then if ( s.chrom_task(i) = 0) then s.chrom_task(i) := 1; else s.chrom_task(i):= s.chrom_task(i)+1; -- if (s.chrom_task(i) > i) then -- s.chrom_task(i) := 0; -- end if; end if; end if; if j<=Nb_NonSecure_low then s.chrom_com(NonSecure_list(j)).mode:= emission; if (s.chrom_com(NonSecure_list(j)).link= undefined) then s.chrom_com(NonSecure_list(j)).link:= noDW; -- elsif (s.chrom_com(NonSecure_list(j)).link= noDW) then -- s.chrom_com(NonSecure_list(j)).link:= tsk; -- -- elsif(s.chrom_com(NonSecure_list(j)).link= tsk) then -- s.chrom_com(NonSecure_list(j)).link:= communication; elsif (s.chrom_com(NonSecure_list(j)).link= noDW) then s.chrom_com(NonSecure_list(j)).link:= communication; elsif(s.chrom_com(NonSecure_list(j)).link= communication) then s.chrom_com(NonSecure_list(j)).link:= noDW; s.chrom_com(NonSecure_list(j)).mode:= noDW; elsif(s.chrom_com(NonSecure_list(j)).link= noDW) then s.chrom_com(NonSecure_list(j)).link:= undefined; end if; end if; end generate_next_element_F2T; -------------------------------- -- generate_next_solution_F2T -- -------------------------------- procedure generate_next_solution_F2T (s : in out solution; -- m : in out chrom_task_type; -- n : in out chrom_com_type; space_search_is_exhausted : out boolean) is i,j,k : integer; g : solution; non: boolean:= True; begin i := 1; j := 1; k:=1; space_search_is_exhausted := False; while (space_search_is_exhausted = False) loop generate_next_element_F2T(s,i,j); if (s.chrom_task(i) <= nb_partitions) AND (i k then -- non := False; -- end if; -- end loop; -- if non = True then nb_sol_Exhaus := nb_sol_Exhaus+1; -- Put_Line("non normalized"); print_genome(s); g:=s; -- Put_Line(" normalized"); -- normalize(g); -- print_genome(g); -- end if; --evaluer elsif (s.chrom_task(i) > nb_partitions) AND (i>1) then s.chrom_task(i):=0; i := i-1; -- j:= j-1; elsif (s.chrom_task(i) > nb_partitions) AND (i=1) then space_search_is_exhausted := True; end if; end loop; end generate_next_solution_F2T; ----------------- -- is_isolated -- ----------------- function is_isolated(task_index : integer; s : solution) return boolean is result : boolean := true; i : integer := 1; begin while (result and i <= genes) loop if (s.chrom_task(i) = s.chrom_task(task_index)) and then (task_index /= i) then result := false; end if; i := i + 1; end loop; return result; end is_isolated; --------------- -- Normalize -- --------------- procedure normalize(s : in out solution) is nb_partitions : integer := 1; -- the vector var is used to know if a gene is normalized or not yet var : chrom_Type; begin -- initialization of the vector var. for i in 1..genes loop var(i) := 0; end loop; ------------------------------------------------------------ -- if var(i) = 0 ==> s.chrom(i) is not yet normalized -- if var(i) = 1 ==> s.chrom(i) is normalized ------------------------------------------------------------ for i in 1..genes loop if (var(i) = 0) then for j in i+1..genes loop if (s.chrom_task(j) = s.chrom_task(i)) and then (var(j) = 0) then var(j) := 1; -- if s.chrom(i) is not normalized then all s.chrom(j) (which egal s.all.chrom(i)) -- are not normalized if (s.chrom_task(i) /= nb_partitions) then s.chrom_task(j) := nb_partitions; end if; end if; end loop; -- we normalize s.chrom(i) if (s.chrom_task(i) /= nb_partitions) then s.chrom_task(i) := nb_partitions; end if; var(i) := 1; nb_partitions := nb_partitions + 1; end if; end loop; end normalize; --------------------- -- number_of_tasks -- --------------------- function Number_of_partitions (s : in solution) return integer is permutation : integer := 1; var : chrom_type; nb_partitions, tmp : integer; begin -- assignment of the table var with elements of s.chrom for i in 1..genes loop var(i) := s.chrom_task(i); end loop; -- sorting elements of var in the increasing order while permutation = 1 loop permutation := 0; for i in 1..genes-1 loop if (var(i) > var(i+1)) then tmp := var(i); var(i) := var(i+1); var(i+1) := tmp; permutation := 1; end if; end loop; end loop; nb_partitions := genes; for i in 1..genes-1 loop if (var(i) = var(i+1)) then nb_partitions := nb_partitions - 1; end if; end loop; return nb_partitions; end Number_of_partitions; ---------------------------------------------- -- Transform_Chromosome_To_CheddarADL_Model -- ---------------------------------------------- procedure Transform_Chromosome_To_CheddarADL_Model (A_sys : in out System; s : in solution) is A_Tasks_set : Tasks_Set; A_Task : Periodic_Task; k : integer; -- A_function_index : integer; period_i : natural; capacity_i : natural; deadline_i : natural; priority_i : natural; criticality_i : natural; confidentiality_i, integrity_i : Unbounded_String; begin -- 1) Generate the tasks set from the solution s -- -- nb_tasks := number_of_tasks(s); Initialize (A_sys.Tasks); Initialize(A_sys.Dependencies.Depends); for i in 1..genes loop k := s.chrom_task(i); period_i := Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => Period); capacity_i := Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => Capacity); deadline_i := Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => Deadline); priority_i:= Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => Priority); criticality_i:= Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => Criticality); confidentiality_i := Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => mils_confidentiality_level); integrity_i := Get(My_Tasks => Initial_system.Tasks, Task_Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Param_Name => mils_integrity_level); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String ("" & i'Img)), Cpu_Name => To_Unbounded_String("processor1"), Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0, Capacity => capacity_i, Period => period_i, Deadline => deadline_i, Jitter => 0, Blocking_Time => 0, Priority => priority_i, Criticality => criticality_i, Policy => Sched_policy, mils_confidentiality_level => MILS_Confidentiality_Level_Type'value( To_String(confidentiality_i)), mils_integrity_level => MILS_Integrity_Level_Type'value( To_String(integrity_i)) ); New_Line; end loop; -- nb_bell_resolved:=0; -- nb_biba_resolved:=0; -- Dependencies -- 2) Generate the dependencies and secure the system depending on the choosen security configuration -- if (s.security_config = 1)then security_configuration1(A_sys, s); elsif (s.security_config = 2)then security_configuration2(A_sys, s); elsif (s.security_config = 3)then security_configuration3(A_sys, s); elsif (s.security_config = 4)then security_configuration4(A_sys, s); elsif (s.security_config =5)then security_configuration5(A_sys, s); elsif (s.security_config = 6)then security_configuration6(A_sys, s); elsif (s.security_config = 7)then security_configuration7(A_sys, s); elsif (s.security_config = 8)then security_configuration8(A_sys, s); elsif (s.security_config =9)then security_configuration9(A_sys, s); elsif (s.security_config = 10)then security_configuration10(A_sys, s); elsif (s.security_config =11)then security_configuration11(A_sys, s); elsif (s.security_config = 12)then security_configuration12(A_sys, s); elsif (s.security_config = 13)then security_configuration13(A_sys, s); elsif (s.security_config = 14)then security_configuration14(A_sys, s); elsif (s.security_config =15)then security_configuration15(A_sys, s); end if; Put_Debug("end_transform"); end Transform_Chromosome_To_CheddarADL_Model; ------------------- -- security configuration 1 -- ------------------- Procedure security_configuration1 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j, finish,intra,inter : Integer; A_task_name : Unbounded_String; A_task_source : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; begin nb_bell_resolved:=0; nb_biba_resolved:=0; -- Dependencies j:=1; y := genes; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); -- Put_Debug("rrrrrrrrrr :"& To_String(Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish+1)))); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication overhead A_task_source.capacity:=A_task_source.capacity+display_blackboard_time; A_task_sink.capacity:=A_task_sink.capacity+read_blackboard_time; -- intra:=1; -- inter:=0; else -- consider the inter partition communication overhead A_task_source.capacity:=A_task_source.capacity+write_sampling_port_time; A_task_sink.capacity:=A_task_sink.capacity+read_sampling_port_time; -- inter:=2; -- intra:=0; end if; -- add dependencies between tasks Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then y := y+1; Put_Debug("Downgrader (Encrypter & Decrypter): "&y'img&" is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW; nb_bell_resolved:=nb_bell_resolved+inter+intra; end if; if (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then y := y+1; Put_Debug("Upgrader : "&y'img&" is added"); A_task_source.capacity:=A_task_source.capacity+capacity_hash; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; end if; j:=j+1; end loop; end security_configuration1; ------------------- -- security configuration 2 -- ------------------- Procedure security_configuration2 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name/=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; end if; j:=j+1; end loop; end security_configuration2; ------------------- -- security configuration 3 -- ------------------- Procedure security_configuration3 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,i, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_DW : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=0) then multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name/=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=0) then multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration3; ------------------- -- security configuration 4 -- ------------------- Procedure security_configuration4 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+display_blackboard_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_blackboard_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; end if; j:=j+1; end loop; end security_configuration4; ------------------- -- security configuration 5 -- ------------------- Procedure security_configuration5 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j, finish : Integer; --inter, intra A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; j:=j+1; end loop; end security_configuration5; ------------------- -- security configuration 6 -- ------------------- Procedure security_configuration6 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,i, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=0) then multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name/=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=0) then multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration6; ------------------- -- security configuration 7 -- ------------------- Procedure security_configuration7 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,i, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_DW : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+display_blackboard_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_blackboard_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=0) then multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=0) then multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration7; ------------------- -- security configuration 8 -- ------------------- Procedure security_configuration8 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,i, finish : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=2*capacity_hash) then multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration8; ------------------- -- security configuration 9 -- ------------------- Procedure security_configuration9 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,i, finish : Integer; A_task_name : Unbounded_String; A_task_source,A_task_DW : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security_inter: security_partition; multiplexe_security_intra: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security_inter(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security_inter(j).confidentiality_capacity:=0; multiplexe_security_inter(j).integrity_capacity:=0; multiplexe_security_intra(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security_intra(j).confidentiality_capacity:=0; multiplexe_security_intra(j).integrity_capacity:=0; end loop; j:=1; while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security_intra(i).confidentiality_capacity:=multiplexe_security_intra(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security_intra(i).confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then multiplexe_security_intra(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security_intra(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security_intra(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security_inter(i).confidentiality_capacity:=multiplexe_security_inter(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security_inter(i).confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then multiplexe_security_inter(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security_inter(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security_inter(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security_intra(i).integrity_capacity:=multiplexe_security_intra(i).integrity_capacity+2*capacity_hash; if (multiplexe_security_intra(i).integrity_capacity=2*capacity_hash) then multiplexe_security_intra(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security_intra(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security_intra(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security_intra(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y:=y+1; i:=i+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security_inter(i).integrity_capacity:=multiplexe_security_inter(i).integrity_capacity+2*capacity_hash; if (multiplexe_security_inter(i).integrity_capacity=2*capacity_hash) then multiplexe_security_inter(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security_inter(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security_inter(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security_inter(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration9; ------------------- -- security configuration 10 -- ------------------- Procedure security_configuration10 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k, finish,inter, intra : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+display_blackboard_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_blackboard_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; -- nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; end if; j:=j+1; end loop; end security_configuration10; ------------------- -- security configuration 11 -- ------------------- Procedure security_configuration11 (A_sys : in out System; s : in solution) is addr_source ,addr_sink : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k, finish : Integer; --inter, intra A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if(A_task_source.address_space_name=A_task_sink.address_space_name) then addr_source:=A_task_source.address_space_name; addr_sink:= A_task_source.address_space_name; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name)then addr_source:=Suppress_Space (To_Unbounded_String ("addr" & k'Img)); addr_sink:= Suppress_Space (To_Unbounded_String ("addr" & k'Img)); end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_source, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_sink, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_source, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_sink, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_source, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => addr_sink, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; j:=j+1; end loop; end security_configuration11; ------------------- -- security configuration 12 -- ------------------- Procedure security_configuration12 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k,i, finish : Integer; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP,A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin i:=0; y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=0) then y:=y+1; multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); end if; end if; j:=j+1; end loop; end security_configuration12; ------------------- -- security configuration 13 -- ------------------- Procedure security_configuration13 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k, finish, inter, intra : Integer; inter_task_confidentiality,inter_task_confidentiality_capacity, inter_task_integrity,inter_task_integrity_capacity : Integer:=0; A_task_name : Unbounded_String; A_task_source,A_task_DW : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; begin j:=1; y := genes; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication Put_Debug("Downgrader (Encrypter & Decrypter) is added"); A_task_source.capacity:=A_task_source.capacity+capacity_encrypter+Key_capacity_DW+display_blackboard_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_decrypter+Key_capacity_DW+read_blackboard_time; -- inter:=2; -- intra:=0; -- nb_bell_resolved:=nb_bell_resolved+inter+intra; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.Dependencies, Source => A_task_source, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication inter_task_confidentiality_capacity:=inter_task_confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (inter_task_confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then y:=y+1; inter_task_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&inter_task_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then A_task_source.capacity:=A_task_source.capacity+capacity_hash+write_sampling_port_time; A_task_sink.capacity:= A_task_sink.capacity+capacity_hash+read_sampling_port_time; -- inter:=2; -- intra:=0; nb_biba_resolved:=nb_biba_resolved+inter+intra; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then inter_task_integrity_capacity:=inter_task_integrity_capacity+2*capacity_hash; if (inter_task_integrity_capacity=2*capacity_hash) then y:=y+1; inter_task_integrity:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& inter_task_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration13; ------------------- -- security configuration 14 -- ------------------- Procedure security_configuration14 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k, finish : Integer; inter_task_confidentiality,inter_task_confidentiality_capacity, inter_task_integrity,inter_task_integrity_capacity : Integer:=0; A_task_name : Unbounded_String; A_task_source,A_task_Key_source,A_task_DW,A_task_DW_decypt : Generic_Task_Ptr; A_task_sink, A_task_Key_sink : Generic_Task_Ptr; A_task_UP,A_task_UP_source, A_task_UP_sink: Generic_Task_Ptr; begin j:=1; y := genes; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication y := y+1; Put_Debug("Downgrader (Encrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_encrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); y:=y+1; Put_Debug("New downgrading task (Decrypter): "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_decrypter, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW_decypt:=Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_DW_decypt); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW_decypt, Sink => A_task_sink); y:=y+1; Put_Debug("New key set up task for encrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_source, Sink => A_task_source); y:=y+1; Put_Debug("New key set up task for decrypter: "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Key_capacity_DW, Period => 100000000, Deadline => 100000000, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_sink.priority'Img)+1, Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_Key_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_Key_sink, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication inter_task_confidentiality_capacity:=inter_task_confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (inter_task_confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then y:=y+1; inter_task_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&inter_task_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then y := y+1; Put_Debug("Hash at emission : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_source := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_source, Sink => A_task_source); y := y+1; Put_Debug("Hash at reception : "&y'img&" is added"); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => capacity_hash, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP_sink := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP_sink, Sink => A_task_sink); elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then inter_task_integrity_capacity:=inter_task_integrity_capacity+2*capacity_hash; if (inter_task_integrity_capacity=2*capacity_hash) then y:=y+1; inter_task_integrity:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& inter_task_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration14; ------------------- -- security configuration 15 -- ------------------- Procedure security_configuration15 (A_sys : in out System; s : in solution) is encrypt_addr ,decrypt_addr : Unbounded_String; capacity_encrypter, capacity_decrypter, capacity_hash : natural; y, j,k,i, finish : Integer; inter_task_confidentiality,inter_task_confidentiality_capacity, inter_task_integrity,inter_task_integrity_capacity : Integer:=0; A_task_name : Unbounded_String; A_task_source,A_task_DW : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; A_task_UP: Generic_Task_Ptr; type security_partition is array (1..nb_partitions) of multiplexe_security_partition; multiplexe_security: security_partition; begin y := genes; for j in 1..nb_partitions loop multiplexe_security(j).addr:= Suppress_Space (To_Unbounded_String ("addr" & j'Img)); multiplexe_security(j).confidentiality_capacity:=0; multiplexe_security(j).integrity_capacity:=0; end loop; j:=1; -- add the extra partition k:=nb_partitions+1; Add_Address_Space (My_Address_Spaces => A_sys.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); while (j<= genes_com) loop finish := index(s.chrom_com(j).source_sink,"_"); A_task_source := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,1,finish-1))) ; A_task_sink := Search_Task (A_sys.Tasks, Suppress_Space (Unbounded_Slice(s.chrom_com(j).source_sink,finish+1,Length(s.chrom_com(j).source_sink)))); if ( Integer'Value (To_String (Suppress_Space (A_task_source.name))) <= 15) then capacity_encrypter:= DW_capacity_encrypt; capacity_decrypter:= DW_capacity_decrypt; capacity_hash:= UP_capacity; else capacity_encrypter:= DW_capacity_encrypt2; capacity_decrypter:= DW_capacity_decrypt2; capacity_hash := UP_capacity2; end if; if (A_task_sink.mils_confidentiality_level< A_task_source.mils_confidentiality_level) then if(A_task_source.address_space_name=A_task_sink.address_space_name) then -- consider the intra partition communication finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).confidentiality_capacity:=multiplexe_security(i).confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (multiplexe_security(i).confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then y := y+1; multiplexe_security(i).tsk_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_source.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&multiplexe_security(i).tsk_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then -- consider the inter partition communication inter_task_confidentiality_capacity:=inter_task_confidentiality_capacity+capacity_encrypter+capacity_decrypter+2*Key_capacity_DW; if (inter_task_confidentiality_capacity=capacity_encrypter+capacity_decrypter+2*Key_capacity_DW) then y:=y+1; inter_task_confidentiality:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_confidentiality_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); else A_task_DW := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&inter_task_confidentiality'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_DW); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_DW, Sink => A_task_sink); end if; end if; elsif (A_task_source.mils_integrity_level< A_task_sink.mils_integrity_level)then Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); if(A_task_source.address_space_name=A_task_sink.address_space_name) then finish := index(A_task_source.address_space_name,"r"); i := Integer'value(To_String( Suppress_Space (Unbounded_Slice(A_task_source.address_space_name,finish+1,Length(A_task_source.address_space_name))))) ; multiplexe_security(i).integrity_capacity:=multiplexe_security(i).integrity_capacity+2*capacity_hash; if (multiplexe_security(i).integrity_capacity=0) then y:=y+1; multiplexe_security(i).tsk_integrity:=y; Put_Debug("Hash is added for partition" & To_String(multiplexe_security(i).addr)); Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => A_task_sink.address_space_name, Task_Type => Periodic_Type, Start_Time => 0 , Capacity => multiplexe_security(i).integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& multiplexe_security(i).tsk_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; elsif (A_task_source.address_space_name/=A_task_sink.address_space_name) then inter_task_integrity_capacity:=inter_task_integrity_capacity+2*capacity_hash; if (inter_task_integrity_capacity=2*capacity_hash) then y:=y+1; inter_task_integrity:=y; Add_Task(My_Tasks => A_sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (To_Unbounded_String ("addr" & k'Img)), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => inter_task_integrity_capacity, Period => A_task_sink.deadline, Deadline => A_task_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( A_task_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Downgrader ); A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""&y'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); else A_task_UP := Search_Task (A_sys.Tasks, Suppress_Space (To_Unbounded_String (""& inter_task_integrity'img))) ; Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_source); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_sink, Sink => A_task_UP); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_UP, Sink => A_task_sink); Add_One_Task_Dependency_precedence (My_Dependencies => A_sys.dependencies, Source => A_task_source, Sink => A_task_sink); end if; end if; end if; j:=j+1; end loop; end security_configuration15; ------------------- -- Create_system -- ------------------- Procedure Create_system (A_system : in out System; s : in solution) is a_core : core_unit_ptr; a_core_unit_table : Core_Units_Table; mem : Memories_Table; -- nb_partitions : integer; begin Initialize(A_System); -- Generate partitions for i in 1..Number_of_partitions(s) loop Add_Address_Space (My_Address_Spaces => A_system.address_spaces, Name => Suppress_Space (To_Unbounded_String ("addr" & i'Img)), Cpu_Name => To_unbounded_string("processor1"), Text_Memory_Size => 0, Stack_Memory_Size => 0, Data_Memory_Size => 0, Heap_Memory_Size => 0, A_Scheduler => POSIX_1003_HIGHEST_PRIORITY_FIRST_PROTOCOL); end loop; Add_core_unit(My_core_units => A_System.core_units, A_core_unit => a_core, Name => to_unbounded_string("core1"), Is_Preemptive => preemptive, Quantum => 0, speed => 1, capacity => 0, period => 0, Priority => 0, File_Name => to_unbounded_string("partition_scheduling_paes.xml"), A_Scheduler => The_scheduler, mem => mem); Add (a_core_unit_table, a_core); Add_Processor(My_Processors => A_System.processors, Name => to_unbounded_string("processor1"), a_Core => a_core); end Create_system; procedure generator_model( a_solution : in solution; nb_partitions: in Integer;N_diff_periods : in Integer; Total_cpu_utilization: in Float) is --------------------------------------------- a_system : System; -- nb_partitions : constant integer := 2 ; actual_cpu_utilization : float := 0.00; Hyperperiod_of_Initial_Taskset : Integer := 4250; T_values : Integer_Array (1 .. genes); -- Priority_values : Integer_Array (1 .. genes):=(5,4,3,2,1,5,4,3,2,1,5,4,3,2,1); Priority_values : Integer_Array (1 .. genes):=(5,4,3,2,1,5,4,3,2,1); --------------------------------------------- Period12000_values :Integer_Array (1 .. 13):=(500,600,750,800,1000,1200,1500,2000,2400,3000,4000,6000,12000); Period_N_diff_periods:Integer_Array (1 .. 3):=(0,0,0); --to 3 different periods shoose randomly in Period12000_values G : Ada.Numerics.Float_Random.Generator; j: Integer; A_task_source : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; found: Boolean; Project_File_Dir_List : unbounded_string_list; function found_element_in_array (x: integer ; Seq : Integer_Array; N_diff_periods:Integer) return boolean is b : boolean := false; i : integer := 1; begin for j in 1..N_diff_periods loop if (seq(i)=x) then b := true; end if; end loop; return b; end found_element_in_array; procedure Shuffle_An_Array (To_Shuffle : in out Integer_Array) is use Ada.Numerics.Float_Random ; N : integer; G : Ada.Numerics.Float_Random.Generator; A_random_position : integer := 0; A_value : integer; begin N := To_Shuffle'Length; reset (G); while N > 1 loop A_random_position := 0; while (A_random_position < 1) or (A_random_position > N) loop A_random_position := Integer (Random(G) * Float(N)); end loop; N := N - 1; A_value := To_Shuffle (A_random_position); To_Shuffle (A_random_position) := To_Shuffle (N); To_Shuffle (N) := A_value; end loop; end Shuffle_An_Array; begin reset(G); -- Initialise the float generator if (N_diff_periods=0) then --cas1 -- T_values:=(500,1000,1000,500,1000,500,1000,1000,500,1000,500,1000,1000,500,1000); T_values:=(500,1000,1000,500,1000,500,1000,1000,500,1000); -- T_values:=(500,1000,1000,2000,2000,500,1000,1000,2000,2000,500,1000,1000,2000,2000); -- T_values:=(500,1000,1000,2000,2000,500,1000,1000,2000,2000,500,1000,1000,2000,2000,1000,1000,1000,1000,1000,1000,1000); -- cas2_set1 -- T_values:=(800,4000,4000,600,600,800,4000,4000,600,600,800,4000,4000,600,600); -- cas2_set2 -- T_values:=(1200,750,750,4000,4000,1200,750,750,4000,4000,1200,750,750,4000,4000); -- cas2_set3 -- T_values:=(800,1000,1000,6000,6000,800,1000,1000,6000,6000,800,1000,1000,6000,6000); else j := 0; -- choose randomly N_diff_periods periods in Period12000_values for i in 1..N_diff_periods loop loop while (j > 13) or (j < 1) loop j := integer (float(13) * random(G)); end loop; found:=found_element_in_array (Period12000_values(j),Period_N_diff_periods,N_diff_periods); exit when not found; end loop; Period_N_diff_periods(i):= Period12000_values(j); Shuffle_An_Array (Period12000_values); end loop; for i in 1..genes loop if (i=1) OR (i=6) OR (i=11) then T_values(i):= Period_N_diff_periods(1); elsif (i=2) OR (i=7) OR (i=12) then T_values(i):= Period_N_diff_periods(2); elsif (i=3) OR (i=8) OR (i=13) then T_values(i):= Period_N_diff_periods(2); elsif (i=4) OR (i=9) OR (i=14) then T_values(i):= Period_N_diff_periods(3); elsif (i=5) OR (i=10) OR (i=15) then T_values(i):= Period_N_diff_periods(3); end if; end loop; end if; -------------------------------------------------------- ------ generate core, processor, address_space ------ -------------------------------------------------------- Create_system(a_system, A_solution); ------------------------- --generate task set ----- ------------------------- Create_Independant_Periodic_TaskSet_System (S => a_system, Current_cpu_utilization => actual_cpu_utilization, N_Tasks => genes, Target_cpu_utilization => Total_cpu_utilization, T_values => T_values, Priority_values => Priority_values); Initial_System:= a_system; ------------------------------ --- Assigne the security levels of tasks and produce dependency --- ------------------------------ for i in 1..genes loop A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("Task"& i'Img))) ; A_task_source.name := Suppress_Space(To_Unbounded_String(""& i'Img)); end loop; A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("1"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("2"))); A_task_source.mils_confidentiality_level:= Top_Secret; A_task_source.mils_integrity_level:= Medium; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("2"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("3"))); A_task_source.mils_confidentiality_level:= Secret; A_task_source.mils_integrity_level:= High; -- A_task_source.criticality:=3; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("3"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("4"))); A_task_source.mils_confidentiality_level:= Top_Secret; A_task_source.mils_integrity_level:= High; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("4"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("5"))); A_task_source.mils_confidentiality_level:= Secret; A_task_source.mils_integrity_level:= Medium; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); ----------------------------------1ÈRE DUPLICATION----------------------------------------- A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("6"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("7"))); -- A_task_source.mils_confidentiality_level:= Top_Secret; -- A_task_source.mils_integrity_level:= Medium; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("7"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("8"))); -- A_task_source.mils_confidentiality_level:= Secret; -- A_task_source.mils_integrity_level:= High; -- A_task_source.criticality:=3; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("8"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("9"))); -- A_task_source.mils_confidentiality_level:= Top_Secret; -- A_task_source.mils_integrity_level:= High; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("9"))) ; A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("10"))); -- A_task_source.mils_confidentiality_level:= Secret; -- A_task_source.mils_integrity_level:= Medium; Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, Source => A_task_source, Sink => A_task_sink); ------------------------------2ÈME DUPLICATION----------------------------------------- -- A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("11"))) ; -- A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("12"))); -- A_task_source.mils_confidentiality_level:= Top_Secret; -- A_task_source.mils_integrity_level:= Medium; -- Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, -- Source => A_task_source, -- Sink => A_task_sink); -- -- A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("12"))) ; -- A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("13"))); -- A_task_source.mils_confidentiality_level:= Secret; -- A_task_source.mils_integrity_level:= High; -- -- A_task_source.criticality:=3; -- Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, -- Source => A_task_source, -- Sink => A_task_sink); -- -- A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("13"))) ; -- A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("14"))); -- A_task_source.mils_confidentiality_level:= Top_Secret; -- A_task_source.mils_integrity_level:= High; -- -- Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, -- Source => A_task_source, -- Sink => A_task_sink); -- -- A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("14"))) ; -- A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String ("15"))); -- A_task_source.mils_confidentiality_level:= Secret; -- A_task_source.mils_integrity_level:= Medium; -- Add_One_Task_Dependency_precedence (My_Dependencies => Initial_System.dependencies, -- Source => A_task_source, -- Sink => A_task_sink); -- ------------------------------------------------------------------------------------------- Put_Debug ("Writing test_Unifast.xmlv3"); Write_To_Xml_File (A_System => Initial_System, File_Name => Suppress_Space (To_Unbounded_String ( "test_Unifast.xmlv3"))); Put_Debug ("Finish write test_Unifast.xmlv3"); end generator_model; ------------------ -- Triplication -- ------------------ procedure Task_duplicate is Sys: System; My_iterator: Tasks_Dependencies_Iterator; Dep_Ptr: Dependency_Ptr; My_dependencies: Tasks_Dependencies_Ptr; y: Natural:=genes+1; A_task_source : Generic_Task_Ptr; A_task_sink : Generic_Task_Ptr; addr: Unbounded_String; begin Sys := Initial_System; My_dependencies := Sys.Dependencies; reset_iterator(My_dependencies.Depends, My_iterator); loop current_element(My_dependencies.Depends, Dep_Ptr, My_iterator); if (Dep_Ptr.precedence_source.address_space_name=To_Unbounded_String("addr1")) then addr:=To_Unbounded_String("addr2"); else addr:=To_Unbounded_String("addr1"); end if; Add_Task(My_Tasks => Sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (addr), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Dep_Ptr.precedence_source.capacity, Period => Dep_Ptr.precedence_source.deadline, Deadline => Dep_Ptr.precedence_source.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( Dep_Ptr.precedence_source.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Dep_Ptr.precedence_source.mils_task ); A_task_source := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String (Integer'Image(y)))) ; y:=y+1; if (Dep_Ptr.precedence_sink.address_space_name=To_Unbounded_String("addr1")) then addr:=To_Unbounded_String("addr2"); else addr:=To_Unbounded_String("addr1"); end if; Add_Task(My_Tasks => Sys.Tasks, Name => Suppress_Space (To_Unbounded_String (""&y'img)), Cpu_Name => Suppress_Space ((To_Unbounded_string("processor1"))) , Address_Space_Name => Suppress_Space (addr), Task_Type => Periodic_Type, Start_Time => 0 , Capacity => Dep_Ptr.precedence_sink.capacity, Period => Dep_Ptr.precedence_sink.deadline, Deadline => Dep_Ptr.precedence_sink.deadline, Jitter => 0, Blocking_Time => 0, Priority => Integer'Value( Dep_Ptr.precedence_sink.priority'Img), Criticality => 0, Policy => Sched_Fifo, mils_task => Dep_Ptr.precedence_sink.mils_task ); A_task_sink := Search_Task (Initial_System.Tasks, Suppress_Space (To_Unbounded_String (Integer'Image(y)))) ; Add_One_Task_Dependency_precedence (My_Dependencies => Sys.dependencies, Source => A_task_source, Sink => A_task_sink); end loop; end Task_duplicate; end Chromosome_Data_Manipulation;