struct fwp_contract {
int budget; /**< bytes per period */
int period_usec; /**< all time units are in microseconds */
+ int deadline_usec;
} fwp_contract_t;
struct fwp_contract_data;
static fwp_contract_t fwp_service_contract = {
.budget = 100,
.period_usec = 30,
+ .deadline_usec = 1000*1000
};
static fwp_vres_params_t fwp_service_vres_params = {
msg_contract->budget = htons(cont->budget);
msg_contract->period_usec = htonl(cont->period_usec);
+ msg_contract->deadline_usec = htonl(cont->deadline_usec);
}
void fwp_msg_contract_out(unsigned char *data, fwp_contract_t *cont)
cont->budget = ntohs(msg_contract->budget);
cont->period_usec = ntohl(msg_contract->period_usec);
+ cont->deadline_usec = ntohl(msg_contract->deadline_usec);
}
void fwp_msg_vres_params_in(unsigned char *data, fwp_vres_params_t *vparams)
struct fwp_msg_contract{
uint16_t budget; /**< bits per second */
uint32_t period_usec; /**< all time units are in microseconds */
+ uint32_t deadline_usec;
}__attribute__((packed));
struct fwp_msg_vres_params{
if (utilization >= 10000 * 96/100) {
contdata_new->status = FWP_CONT_NOTNEGOTIATED;
} else {
- contdata_new->status = FWP_CONT_RESERVED;
- contdata_new->vres_params.ac_id = FWP_AC_VI;
- contdata_new->vres_params.budget = contdata_new->contract.budget;
- contdata_new->vres_params.period_usec = contdata_new->contract.period_usec;
+ struct fwp_contract *c = &contdata_new->contract;
+ int d = c->deadline_usec;
+ if (d <= 0) d = 100*1000*1000;
+ if (d < 50000) {
+ contdata_new->status = FWP_CONT_NOTNEGOTIATED;
+ } else {
+ contdata_new->status = FWP_CONT_RESERVED;
+ }
+
+ contdata_new->vres_params.ac_id =
+ d < 100*1000 ? FWP_AC_VO :
+ d < 500*1000 ? FWP_AC_VI :
+ d < 1000*1000 ? FWP_AC_BE :
+ FWP_AC_BK;
+ contdata_new->vres_params.budget = c->budget;
+ contdata_new->vres_params.period_usec = c->period_usec;
}
}
int ret;
/* Contract for client->server stream */
-
+ memset(&contract, 0, sizeof(contract));
contract.budget = stream->packet_size;
contract.period_usec = stream->period_usec;
+ contract.deadline_usec = 3*stream->period_usec;
contract_d = fwp_contract_create(&contract);
ret = fwp_contract_negotiate(contract_d, &stream->vres);
}
/* Contract for server->client stream */
+ memset(&contract, 0, sizeof(contract));
contract.budget = stream->packet_size;
contract.period_usec = stream->period_usec;
+ contract.deadline_usec = 3*stream->period_usec;
contract_d = fwp_contract_create(&contract);
ret = fwp_contract_negotiate(contract_d, &vres2);