fwp_vres_params_t vparams;
fwp_contract_status_t status;
struct fwp_msgb *msgb;
- unsigned int code, hid;
+ unsigned int code, hid, _appid;
struct sockaddr_un from;
socklen_t fromlen = sizeof(struct sockaddr_un);
int rc;
if (!msgb)
return -ENOMEM;
- fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_REQ, 0);
+ fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_REQ, getpid(), 0);
fwp_msgb_put(msgb, sizeof(struct fwp_msg_header));
fwp_msg_contract_deflate(msgb->tail, contract);
&from, &fromlen);
FWP_DEBUG("Negotiation response received from agent\n");
- fwp_msg_header_inflate(msgb->data, &code, &hid);
+ fwp_msg_header_inflate(msgb->data, &code, &_appid, &hid);
fwp_msgb_pull(msgb, sizeof(struct fwp_msg_header));
fwp_msg_vres_params_inflate(msgb->data, &status, &vparams);
* programmer.
*
*/
+typedef
struct fwp_contract {
int budget; /**< bytes per period */
int period_usec; /**< all time units are in microseconds */
#include "fwp_msg.h"
void fwp_msg_header_deflate(unsigned char *data, unsigned int code,
- unsigned int hid)
+ unsigned int appid, unsigned int hid)
{
struct fwp_msg_header* header;
fwp_msgb_put(msgb, sizeof(struct fwp_msg_header));*/
header->code = code;
+ header->appid = htonl(appid);
header->hid = htons(hid);
}
void fwp_msg_header_inflate(unsigned char *data, unsigned int *code,
- unsigned int *hid)
+ unsigned int *appid, unsigned int *hid)
{
struct fwp_msg_header *header;
header = (struct fwp_msg_header*) data;
/*fwp_msgb_pull(msgb,sizeof(struct fwp_msg_header));*/
*code = header->code;
+ *appid = ntohl(header->appid);
*hid = ntohs(header->hid);
}
#define FWP_CONTNEGT_REQ 0x02 /* contract negotiation request */
#define FWP_CONTNEGT_RES 0x03 /* contract negotiation response */
+#if 0
+struct fwp_handshake{
+ unsigned int id; /* hid */
+ unsigned int appid; /* pid or port */
+} fwp_handshake_t;
+#endif
+
struct fwp_msg_header{
+ uint32_t appid; /**< application id */
uint16_t hid; /**< handshake ID */
- uint16_t appid; /**< application id */
uint8_t code;
}__attribute__((packed));
void fwp_msg_header_deflate(unsigned char *data, unsigned int code,
- unsigned int hid);
+ unsigned int appid, unsigned int hid);
void fwp_msg_header_inflate(unsigned char *data, unsigned int *code,
- unsigned int *hid);
+ unsigned int *appid, unsigned int *hid);
void fwp_msg_contract_deflate(unsigned char *data, struct fwp_contract *cont);
void fwp_msg_contract_inflate(unsigned char *data, struct fwp_contract *cont);
socklen_t addrlen;
} fwp_sockaddr_t;
+typedef
struct fwp_msgb {
size_t buf_size;
size_t len; /**< msg data length*/
#include "fwp_proto.h"
-struct sockaddr_un fwp_agent_addr;
-struct sockaddr_un fwp_client_addr;
-int fwp_client_sockfd;
+struct sockaddr_un fwp_agent_addr;
+struct sockaddr_un fwp_client_addr;
+int fwp_client_sockfd;
+unsigned int appid;
/*
*TODO: return values other than -1
bzero(&fwp_agent_addr, sizeof(fwp_agent_addr));
fwp_agent_addr.sun_family = AF_UNIX;
strcpy(fwp_agent_addr.sun_path, FWP_AGENT_UNIXPATH);
-
+
+ appid = getpid();
return 0;
}
#define FWP_AGENT_UNIXPATH "/tmp/fwpagent"
#define FWP_CLIENT_UNIXPATH "/tmp/fwpclient" /*temporarily*/
+extern unsigned int appid;
+
int fwp_init();
#endif
/**< all time units are in microseconds */
int period_usec;
/**< STA-unique identifier of vres params assigned by manager*/
- unsigned int vres_id;
+ unsigned int id;
fwp_ac_t ac_id; /**< AC id ~ priority of vres */
} fwp_vres_params_t;
CFLAGS = -Wall -D_REENTRANT -g
fwpagent_SOURCES+= fwp_agent.c fwp_forwardtbl.c
-fwpmngr_SOURCES+= fwp_mngr.c fwp_forwardtbl.c fwp_contract_table.c fwp_admctrl.c
+fwpmngr_SOURCES+= fwp_mngr.c fwp_contract_table.c fwp_agent_table.c fwp_admctrl.c
#fwpmngr_SOURCES+= admtest_stupid.c
#fwpmngr_SOURCES+= admtest_utilization.c
/**
* Handler for contract negotiation request
*/
-void fwp_agent_contnegt_request(struct fwp_msgb *msgb)
+void fwp_agent_contract_negt_request(struct fwp_msgb *msgb)
{
fwp_handshake_t handshake;
/* Add hanshake id to header */
fwp_msgb_push(msgb, sizeof(struct fwp_msg_header));
- fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_REQ, handshake.id);
+ fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_REQ, 0, handshake.id);
/* forward request to manager*/
FWP_DEBUG("Request forwarded to vres\n");
/**
* Handler for contract negotiation response
*/
-int fwp_agent_contnegt_response(struct fwp_msgb *msgb, unsigned int hid)
+int fwp_agent_contract_negt_response(struct fwp_msgb *msgb, unsigned int hid)
{
fwp_handshake_t *handshake;
struct sockaddr_un *unsock;
*/
void fwp_agent_msg_handler(struct fwp_msgb *msgb)
{
- unsigned int code, hid;
+ unsigned int code, hid, appid;
- fwp_msg_header_inflate(msgb->data, &code, &hid);
+ fwp_msg_header_inflate(msgb->data, &code, &appid, &hid);
fwp_msgb_pull(msgb, sizeof(struct fwp_msg_header));
FWP_DEBUG("code = %d , hid = %d\n", code, hid);
switch (code) {
case FWP_CONTNEGT_REQ:
FWP_DEBUG("Negotiation Request received\n");
- fwp_agent_contnegt_request(msgb);
+ fwp_agent_contract_negt_request(msgb);
break;
case FWP_CONTNEGT_RES:
FWP_DEBUG("Negotiation Response received\n");
- fwp_agent_contnegt_response(msgb, hid);
+ fwp_agent_contract_negt_response(msgb, hid);
break;
default:
#include "fwp_agent_table.h"
+#include <stdlib.h>
+
GAVL_CUST_NODE_INT_DEC(_fwp_agent_table, fwp_agent_table_t, fwp_agent_data_t,
- unsigned int, agent_tree, tree_node, addr,
+ unsigned int, agent_tree, tree_node, _addr,
gavl_cmp_int);
GAVL_CUST_NODE_INT_IMP(_fwp_agent_table, fwp_agent_table_t, fwp_agent_data_t,
- unsigned int, agent_tree, tree_node, label,
+ unsigned int, agent_tree, tree_node, _addr,
gavl_cmp_int);
void fwp_agent_table_init(struct fwp_agent_table *tbl)
tbl->nr_agents = 0;
}
-int fwp_agent_table_insert(fwp_agent_table_t *tbl,
+void fwp_agent_table_insert(fwp_agent_table_t *tbl,
fwp_sockaddr_t *agent_sockaddr)
{
-{
- unsigned int addr;
struct sockaddr_in *addr_in;
+ fwp_agent_data_t *agdata;
- addr_in = (struct sockaddr_in*) agent_sockaddr->addr;
- addr = addr_in->sin_addr;
-
- fwp_agent_table_find(tbl, agent_sockaddr);
+ agdata = fwp_agent_table_find(tbl, agent_sockaddr);
if (!agdata) {
/* Alloc new agent data */
agdata = (fwp_agent_data_t*)malloc(sizeof(fwp_agent_data_t));
- agdata->addr = addr;
- memcpy(agdata->peer, agent_addr, sizeof(fwp_sockaddr));
- fwp_contract_table_init(agdata->contract_tree);
- fwp_agent_table_insert(agent_table, &agdata);
+ addr_in = (struct sockaddr_in*) agent_sockaddr->addr;
+ agdata->_addr = addr_in->sin_addr.s_addr;
+ memcpy(&agdata->addr, agent_sockaddr, sizeof(fwp_sockaddr_t));
+ fwp_contract_table_init(&agdata->contract_table);
+ _fwp_agent_table_insert(tbl, agdata);
}
/* obtain fwp ctable mutex */
_fwp_agent_table_insert(tbl, agdata);
struct sockaddr_in *addr_in;
addr_in = (struct sockaddr_in*) agent_sockaddr->addr;
- addr = addr_in->sin_addr;
+ addr = addr_in->sin_addr.s_addr;
return _fwp_agent_table_find(tbl, &addr);
}
#ifndef _FWP_AGENT_TABLE_H
#define _FWP_AGENT_TABLE_H
-typedef
+#include "fwp_msgb.h"
+#include "fwp_contract_table.h"
+
+#include "ul_list.h"
+#include "ul_gavlcust.h"
+
+typedef
struct fwp_agent_data {
- int addr;
- fwp_sockaddr peer;
- gavl_node_t *contract_tree;
+ unsigned int _addr;
+ fwp_sockaddr_t addr;
+ fwp_contract_table_t contract_table;
gavl_node_t tree_node;
} fwp_agent_data_t;
typedef
struct fwp_agent_table {
- unsigned int nr_agent;
+ unsigned int nr_agents;
/*pthread_mutex_t lock; */
/*gavl_cust_root_field_t root;*/
gavl_node_t *agent_tree;
} fwp_agent_table_t;
void fwp_agent_table_init(fwp_agent_table_t *tbl);
-int fwp_agent_table_insert(fwp_agent_table_t *tbl,
- fwp_agent_data_t *contdata);
-fwp_agent_data_t*
-fwp_agent_table_find(fwp_agent_table_t *tbl, unsigned int id);
-
+void fwp_agent_table_insert(fwp_agent_table_t *tbl,
+ fwp_sockaddr_t *agent_sockaddr);
+fwp_agent_data_t* fwp_agent_table_find(fwp_agent_table_t *tbl,
+ fwp_sockaddr_t *agent_sockaddr);
int fwp_agent_table_delete(fwp_agent_table_t *tbl,
fwp_agent_data_t *contdata);
-#endif /*_FWP_AGENT_TABLE_H*/
+#endif /*_FWP_AGENT_TABLE_H */
/* obtain fwp ctable mutex */
/* find free contract */
- contdata->label = id;
+ contdata->vres_params.id = id;
_fwp_contract_table_insert(tbl, contdata);
tbl->nr_contracts++;
/* release fwp_contract_table mutex */
#include <string.h>
+struct fwp_agent_data;
/**
* FWP vres parameters
* It is internal representation of the contract used inside
/* parameters from contract negotiated for vres */
fwp_vres_params_t vres_params;
/**< the address of agent from that the contract comes */
- fwp_agent_data_t *agent;
+ struct fwp_agent_data *agent;
/**< application identifier */
unsigned int appid;
/**< handshake ID, used in request-respone message exchange to
/*gavl_cust_root_field_t root;*/
unsigned int id_counter;
/*ul_list_head_t cont_list;*/
- gavl_node_t *cont_tree;
+ gavl_node_t *contract_tree;
} fwp_contract_table_t;
void fwp_contract_table_init(fwp_contract_table_t *tbl);
//#include "admtest.h"
#include "fwp_mngt.h"
#include "fwp_contract_table.h"
+#include "fwp_agent_table.h"
#include "fwp_admctrl.h"
//static struct sockaddr_un fwp_laddr; /**< FWP local address */
/* Agent table */
fwp_agent_table_t agent_table; /**< agent table*/
-/* Contract table */
-fwp_contract_table_t contractbl; /**< contract table*/
-
/* List of requested contracts */
/*fwp_contractlist_t contractlist_req;*/
/* for simplicity only one contract is to be negotiated now*/
-fwp_contract_data_t *cont_req;
+fwp_contract_data_t *contract_req;
/* Admission control test */
fwp_admctrl_test_t fwp_admctrl_test = &fwp_admctrl_stupid;
}
int
-fwp_mngr_contract_negt_response(unsigned int hid, fwp_contract_data_t *contdata)
+fwp_mngr_contract_negt_response(fwp_contract_data_t *contdata)
{
struct fwp_msgb *msgb;
return -ENOMEM;
}
- fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_RES, hid);
+ fwp_msg_header_deflate(msgb->tail, FWP_CONTNEGT_RES, contdata->appid,
+ contdata->hid);
fwp_msgb_put(msgb, sizeof(struct fwp_msg_header));
fwp_msg_vres_params_deflate(msgb->tail, contdata->status,
&contdata->vres_params);
fwp_msgb_put(msgb, sizeof(struct fwp_msg_vres_params));
- msgb->peer = &contdata->source;
- /* add sending to local app through unix socket */
+ msgb->peer = &contdata->agent->addr;
+ /* TODO: add sending to local app through unix socket */
fwp_vres_send(service_vres_id, msgb);
return 0;
}
-static void fwp_mngr_contract_accept(fwp_contract_data_t *contdata)
+static int fwp_mngr_contract_accept(fwp_contract_data_t *contdata)
{
- fwp_agent_data agdata;
+ fwp_agent_data_t *agdata;
if (contdata->status != FWP_CONT_NEGOTIATED) {
return -1;
agdata = contdata->agent;
if (agdata) {
- fwp_contract_table_insert(agdata->contract_tree, contdata);
+ fwp_contract_table_insert(&agdata->contract_table, contdata);
}
return 0;
}
-int fwp_mngr_contract_negt_request(fwp_fwp_msgb_t *msgb,
+int fwp_mngr_contract_negt_request(fwp_msgb_t *msgb,
+ unsigned int appid, unsigned int hid,
fwp_contract_data_t **contract_data)
{
fwp_contract_t contract;
fwp_contract_data_t *contdata;
- fwp_agent_data_t agdata;
/* deserialize contract from message */
fwp_msg_contract_inflate(msgb->data, &contract);
/* prepare contract data structure */
contdata = (fwp_contract_data_t*) malloc(sizeof(fwp_contract_data_t));
- /* copy contract */
+ /* copy contract to contract_data */
memcpy(&contdata->contract, &contract, sizeof(contdata->contract));
/* set pointer to agent data */
- agdata = fwp_mngr_agent_data_get(msgb->peer);
- if (!agdata) {
- return -1;
- }
- contdata->agent = agdata;
-
+ contdata->agent = fwp_agent_table_find(&agent_table, msgb->peer);
+ /* set appid and hid */
+ contdata->appid = appid;
+ contdata->hid = hid;
contdata->status = FWP_CONT_REQUESTED;
+
fwp_msgb_free(msgb);
/* put contract data into contract requested list */
static void fwp_mngr_msg_handler(struct fwp_msgb *msgb)
{
- unsigned int code, hid;
- fwp_sockaddr_t sockaddr;
+ unsigned int code, hid, appid;
- fwp_msg_header_inflate(msgb->data, &code, &hid);
+ fwp_msg_header_inflate(msgb->data, &code, &appid, &hid);
fwp_msgb_pull(msgb, sizeof(struct fwp_msg_header));
- FWP_DEBUG("code = %d , hid = %d\n", code, hid);
+ FWP_DEBUG("code = %d , appid = %d hid = %d\n", code, appid, hid);
- agdata = fwp_mngr_agent_data_get(msgb->peer);
+ fwp_agent_table_insert(&agent_table, msgb->peer);
switch (code) {
case FWP_CONTNEGT_REQ:
- FWP_DEBUG("Negotiation Request received\n");
- fwp_mngr_contract_negt_request(msgb, &contract_req);
+ FWP_DEBUG("Negotiation Request received\n");
+ fwp_mngr_contract_negt_request(msgb,
+ appid, hid,
+ &contract_req);
FWP_DEBUG("Executing admission control test\n");
fwp_admctrl_test(contract_req);
/* right now simply add to contract table if negotiated */
- fwp_mngr_contract_accept(&msgb->peer, contract_req);
+ //fwp_mngr_contract_accept(&msgb->peer, contract_req);
FWP_DEBUG("Preparing NEGT_RES msg\n");
- fwp_mngr_contract_negt_response(hid, contract_req)
+ fwp_mngr_contract_negt_response(contract_req);
break;
default:
printf("Invalid message\n.");