34,41 → 34,46 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* |
* |
* CVS : $Id: server-task.c,v 1.1 2004-05-20 12:13:55 trimarchi Exp $ |
* CVS : $Id: server-task.c,v 1.2 2004-05-25 12:38:05 trimarchi Exp $ |
*/ |
|
#include "ll/i386/64bit.h" |
#include <kernel/kern.h> |
#include <modules/sem.h> |
#include <modules/hartport.h> |
#include <modules/cabs.h> |
#include <string.h> |
#include "fsf_contract.h" |
#include "fsf_server.h" |
#include "fsf_service_task.h" |
#include "message.h" |
|
TASK service_task() { |
|
struct mess message; |
PORT rec,tra; |
|
char *mchannel[2]={"MCHANR","MCHANW"}; |
CAB mchannelid[2]; |
rec = port_connect("CHANW",sizeof(struct mess),STREAM,READ); |
|
TASK service_task(void *arg) { |
cprintf("task start\n", rec); |
tra = port_connect("CHANR",sizeof(struct mess),STREAM,WRITE); |
cprintf("task start\n", tra); |
|
int id=(int) arg; |
struct mess_type message; |
CAB ch=mchannelid[id]; |
cprintf("Fine connect %d\n", rec); |
|
while(1) { |
|
message = (struct mess_type) cab_getmes(channel); |
|
// wait for renegotiation |
cprintf("(pr_t %d)",port_receive(rec,&message,BLOCK)); |
switch (message.type) { |
|
case NEGOTIATE_CONTRACT: |
if (negotiate_contract(message.contract, message.server)!=FSF_ERR_CONTRACT_REJECTED) { |
if (negotiate_contract(&message.contract, &message.server)==FSF_ERR_CONTRACT_REJECTED) |
message.server=-1; |
|
|
} else { |
} |
|
break; |
case RENEGOTIATE_CONTRACT: |
renegotiate_contract(message.contract, message.server); |
if (renegotiate_contract(&message.contract, message.server)==FSF_ERR_CONTRACT_REJECTED) |
message.server=-1; |
break; |
|
default : |
75,18 → 80,75 |
break; |
|
} |
// send response server is -1 if the operation fail |
cprintf("(ps_t %d)",port_send(tra,&message,BLOCK)); |
|
task_endcycle(); |
|
} |
} |
|
task_endcycle(); |
int renegotiate_contract |
(const fsf_contract_parameters_t *new_contract, |
fsf_server_id_t server) |
{ |
TIME T,Q; |
int i; |
|
#ifdef FSF_DEBUG |
kern_printf("(Renegotiate for server %d)",server); |
#endif |
|
if (!new_contract) |
return FSF_ERR_NOT_INITIALIZED; |
|
if (server < 0) |
return FSF_ERR_INVALID_SERVER; |
|
// change the parameter |
relink_contract_to_server(new_contract, server); |
if (recalculate_contract(fsf_max_bw)==-1) { |
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; |
} |
|
return 0; |
} |
|
int negotiate_contract |
(const fsf_contract_parameters_t *contract, |
fsf_server_id_t *server) |
{ |
int i=0; |
TIME T; |
TIME Q; |
/* Check if contract is initialized */ |
97,11 → 159,65 |
if (add_contract(contract)) |
return FSF_ERR_CONTRACT_REJECTED; |
|
/* SERVER => BUDGET */ |
set_SERVER_budget_from_contract(contract,server); |
|
#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) { |
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 { |
return FSF_ERR_CREATE_SERVER; |
} |
|
return 0; |
|
} |
|
|
#if defined MICHAEL |
int recalculate_contract(bandwidth_t U) { |
bandwidth_t current_bandwidth; |
unsigned int temp_U; |
159,3 → 275,4 |
|
return 0; |
} |
#endif |