12,13 → 12,20 |
//===================================================================== |
|
#include "ll/i386/64bit.h" |
#include <kernel/kern.h> |
#include <modules/sem.h> |
#include <modules/hartport.h> |
#include <modules/cabs.h> |
|
#include "fsf_contract.h" |
#include "fsf_server.h" |
#include "fsf_service_task.h" |
#include "message.h" |
|
#include <pthread.h> |
#include <stdlib.h> |
|
|
//#define FSF_DEBUG |
|
int current_server=0; |
26,7 → 33,10 |
bandwidth_t fsf_max_bw = 0; |
|
int fsf_server_level; |
PID server_task; |
|
PORT channel[2]; |
|
int FSF_register_module(int server_level, bandwidth_t max_bw) |
{ |
printk("FSF Module\n"); |
33,11 → 43,36 |
current_server=0; |
fsf_server_level = server_level; |
fsf_max_bw = max_bw; |
|
|
return 0; |
|
} |
|
void FSF_start_service_task(SOFT_TASK_MODEL *model) { |
|
// create the service task |
cprintf("Create Service Task\n"); |
// create the communication channel for negotiation and renegotiation |
|
channel[1] = port_create("CHANW",sizeof(struct mess),1,STREAM,WRITE); |
cprintf("(ch %d)", channel[1]); |
|
channel[0] = port_create("CHANR",sizeof(struct mess),1,STREAM,READ); |
cprintf("(ch %d)", channel[0]); |
|
server_task = task_create("stask",service_task,model,NULL); |
if (server_task == -1) { |
cprintf("error creating service task\n"); |
sys_shutdown_message("Could not create service_task"); |
sys_end(); |
return; |
} |
|
task_activate(server_task); |
|
} |
|
|
/* Convert the contract specification to |
* budget parameters |
*/ |
242,75 → 277,21 |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server) |
{ |
SYS_FLAGS f; |
int i=0; |
TIME T; |
TIME Q; |
/* Check if contract is initialized */ |
if (!contract) return FSF_ERR_NOT_INITIALIZED; |
struct mess message; |
|
/* Admission Test */ |
if (FSF_ADMISSION_TEST_IS_ENABLED) |
if (add_contract(contract)) |
return FSF_ERR_CONTRACT_REJECTED; |
f = kern_fsave(); |
// send response server is -1 if the operation fail |
message.type=NEGOTIATE_CONTRACT; |
memmove(&message.contract,contract, sizeof(fsf_contract_parameters_t)); |
|
/* SERVER => BUDGET */ |
set_SERVER_budget_from_contract(contract,server); |
cprintf("(ps %d)",port_send(channel[1],&message,BLOCK)); |
|
cprintf("(pr %d)\n",port_receive(channel[0], &message, BLOCK)); |
|
if (message.server==-1) |
return FSF_ERR_CONTRACT_REJECTED; |
|
#ifdef FSF_DEBUG |
kern_printf("(New Server %d)",*server); |
#endif |
|
if (*server >= 0) { |
link_contract_to_server(contract,*server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
#ifdef FSF_DEBUG |
kern_printf("(Adjust budget)"); |
#endif |
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
|
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T , server_list[i].deadline); |
|
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
|
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,Q, server_list[i].Tmin , server_list[i].deadline); |
|
} |
|
|
server_list[i].U=server_list[i].Umin; |
|
} |
} |
else { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
kern_frestore(f); |
|
*server=message.server; |
|
return 0; |
|
} |
596,64 → 577,25 |
|
return 0; |
} |
|
|
int fsf_renegotiate_contract |
(const fsf_contract_parameters_t *new_contract, |
fsf_server_id_t server) |
{ |
SYS_FLAGS f; |
TIME T,Q; |
int i; |
|
#ifdef FSF_DEBUG |
kern_printf("(Renegotiate for server %d)",server); |
#endif |
|
struct mess message; |
|
if (!new_contract) |
return FSF_ERR_NOT_INITIALIZED; |
// send response server is -1 if the operation fail |
message.type=RENEGOTIATE_CONTRACT; |
memmove(&message.contract,new_contract, sizeof(fsf_contract_parameters_t)); |
message.server = server; |
|
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
// compute the new value |
f = kern_fsave(); |
// change the parameter |
relink_contract_to_server(new_contract, server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
kern_frestore(f); |
return FSF_ERR_CREATE_SERVER; |
} |
|
for (i=0; i<current_server; i++) { |
mul32div32to32(MAX_BANDWIDTH,server_list[i].Cmin,server_list[i].U,T); |
if (T > server_list[i].Tmin ) { |
server_list[i].actual_budget = server_list[i].Cmin; |
server_list[i].actual_period = T; |
#ifdef FSF_DEBUG |
kern_printf("(1 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, T); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, T, server_list[i].deadline); |
|
} else { |
mul32div32to32(server_list[i].Tmin,server_list[i].U,MAX_BANDWIDTH,Q); |
server_list[i].actual_budget = Q; |
server_list[i].actual_period = server_list[i].Tmin; |
#ifdef FSF_DEBUG |
kern_printf("(2 - Q %ld T %ld)", server_list[i].actual_budget, server_list[i].actual_period); |
#endif |
|
if (server_list[i].d_equals_t == TRUE) |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].Tmin); |
else |
adjust_SERVER_budget(server_list[i].server,server_list[i].Cmin, server_list[i].Tmin, server_list[i].deadline); |
} |
|
server_list[i].U=server_list[i].Umin; |
} |
kern_frestore(f); |
//port_send(channel,&message,BLOCK); |
|
//port_receive(channel, &message, BLOCK); |
|
if (message.server==-1) return FSF_ERR_CONTRACT_REJECTED; |
|
return 0; |
} |
|