#define ADDRLEN_MAX 30
+typedef
struct fwp_sockaddr{
char addr[ADDRLEN_MAX];
socklen_t addrlen;
-};
+} fwp_sockaddr_t;
struct fwp_msgb {
size_t buf_size;
unsigned char *tail; /**< msg data end*/
struct fwp_sockaddr *peer; /**< peer address*/
/*int flags; MSG_DONTWAIT for async*/
-};
+} fwp_msgb_t;
struct fwp_msgb* fwp_msgb_alloc(size_t buf_size);
void fwp_msgb_free(struct fwp_msgb* msgb);
CFLAGS = -Wall -D_REENTRANT -g
fwpagent_SOURCES+= fwp_agent.c fwp_forwardtbl.c
-fwpmngr_SOURCES+= fwp_mngr.c fwp_forwardtbl.c fwp_contractbl.c fwp_admctrl.c
+fwpmngr_SOURCES+= fwp_mngr.c fwp_forwardtbl.c fwp_contract_table.c fwp_admctrl.c
#fwpmngr_SOURCES+= admtest_stupid.c
#fwpmngr_SOURCES+= admtest_utilization.c
#ifndef _FWP_ADMCTRL_H
#define _FWP_ADMCTRL_H
-#include "fwp_contractbl.h"
+#include "fwp_contract_table.h"
typedef void (*fwp_admctrl_test_t)(fwp_contract_data_t *contdata);
--- /dev/null
+#include "fwp_agent_table.h"
+
+GAVL_CUST_NODE_INT_DEC(_fwp_agent_table, fwp_agent_table_t, fwp_agent_data_t,
+ 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, gavl_cmp_int);
+
+void fwp_agent_table_init(struct fwp_agent_table *tbl)
+{
+ _fwp_agent_table_init_root_field(tbl);
+ tbl->nr_agents = 0;
+}
+
+int fwp_agent_table_insert(fwp_agent_table_t *tbl,
+ fwp_agent_data_t *agdata)
+{
+ /* obtain fwp ctable mutex */
+ _fwp_agent_table_insert(tbl, agdata);
+ tbl->nr_agents++;
+ /* release fwp_contract_table mutex */
+}
+
+fwp_agent_data_t* fwp_agent_table_find(fwp_agent_table_t *tbl,
+ unsigned int id)
+{
+ return _fwp_agent_table_find(tbl, &id);
+}
+
+int fwp_agent_table_delete(fwp_agent_table_t *tbl,
+ fwp_agent_data_t *agdata)
+{
+ int rv;
+
+ rv = _fwp_agent_table_delete(tbl, agdata);
+ tbl->nr_agents--;
+
+ return rv;
+}
--- /dev/null
+#ifndef _FWP_AGENT_TABLE_H
+#define _FWP_AGENT_TABLE_H
+
+typedef
+struct fwp_agent_data {
+ int addr;
+ fwp_sockaddr peer;
+ gavl_node_t *contract_tree;
+
+ gavl_node_t tree_node;
+} fwp_agent_data_t;
+
+typedef
+struct fwp_agent_table {
+ unsigned int nr_agent;
+ /*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);
+
+int fwp_agent_table_delete(fwp_agent_table_t *tbl,
+ fwp_agent_data_t *contdata);
+
+#endif /*_FWP_AGENT_TABLE_H*/
--- /dev/null
+#include "fwp_contract_table.h"
+
+GAVL_CUST_NODE_INT_DEC(_fwp_contract_table, fwp_contract_table_t, fwp_contract_data_t,
+ unsigned int, cont_tree, tree_node, label, gavl_cmp_int);
+
+GAVL_CUST_NODE_INT_IMP(_fwp_contract_table, fwp_contract_table_t, fwp_contract_data_t,
+ unsigned int, contract_tree, tree_node, label, gavl_cmp_int);
+
+void fwp_contract_table_init(struct fwp_contract_table *tbl)
+{
+ tbl->id_counter = 0;
+ _fwp_contract_table_init_root_field(tbl);
+ tbl->nr_contracts = 0;
+}
+
+int fwp_contract_table_insert(fwp_contract_table_t *tbl,
+ fwp_contract_data_t *contdata)
+{
+ unsigned int id = tbl->id_counter++;
+
+ /* obtain fwp ctable mutex */
+ /* find free contract */
+ contdata->label = id;
+ _fwp_contract_table_insert(tbl, contdata);
+ tbl->nr_contracts++;
+ /* release fwp_contract_table mutex */
+
+ return id;
+}
+
+fwp_contract_data_t* fwp_contract_table_find(fwp_contract_table_t *tbl, unsigned int id)
+{
+ return _fwp_contract_table_find(tbl, &id);
+}
+
+int fwp_contract_table_delete(fwp_contract_table_t *tbl,
+ fwp_contract_data_t *contdata)
+{
+ int rv;
+
+ rv = _fwp_contract_table_delete(tbl, contdata);
+ tbl->nr_contracts--;
+
+ return rv;
+}
+
-#ifndef _FWP_CONTRACTBL_H
-#define _FWP_CONTRACTBL_H
+#ifndef _FWP_CONTRACT_TABLE_H
+#define _FWP_CONTRACT_TABLE_H
#include "fwp_conf.h"
#include "fwp_contract.h"
*
*/
typedef
-struct fwp_contractlist {
+struct fwp_contract_list {
ul_list_head_t head;
-} fwp_contractlist_t;
+} fwp_contract_list_t;
-UL_LIST_CUST_DEC(fwp_contractlist, fwp_contractlist_t, fwp_contract_data_t,
+UL_LIST_CUST_DEC(fwp_contract_list, fwp_contract_list_t, fwp_contract_data_t,
head, list_node);
-
/**
* Table of contract_data structures
*
*/
typedef
-struct fwp_contractbl {
- /*struct fwp_contract_data entry[FWP_CONTRACT_MAX];*/
- unsigned int nr_contract;
+struct fwp_contract_table {
+ unsigned int nr_contracts;
/*pthread_mutex_t lock; */
/*gavl_cust_root_field_t root;*/
unsigned int id_counter;
/*ul_list_head_t cont_list;*/
gavl_node_t *cont_tree;
-} fwp_contractbl_t;
-
-GAVL_CUST_NODE_INT_DEC(_fwp_contractbl, fwp_contractbl_t, fwp_contract_data_t,
- unsigned int, cont_tree, tree_node, label, gavl_cmp_int);
-
+} fwp_contract_table_t;
-void fwp_contractbl_init(fwp_contractbl_t *tbl);
-int fwp_contractbl_insert(fwp_contractbl_t *tbl,
+void fwp_contract_table_init(fwp_contract_table_t *tbl);
+int fwp_contract_table_insert(fwp_contract_table_t *tbl,
fwp_contract_data_t *contdata);
fwp_contract_data_t*
-fwp_contractbl_find(fwp_contractbl_t *tbl, unsigned int id);
+fwp_contract_table_find(fwp_contract_table_t *tbl, unsigned int id);
-int fwp_contractbl_delete(fwp_contractbl_t *tbl,
+int fwp_contract_table_delete(fwp_contract_table_t *tbl,
fwp_contract_data_t *contdata);
-#endif /* _FWP_CONTRACTBL_H */
+#endif /* _FWP_CONTRACT_TABLE_H */
+++ /dev/null
-#include "fwp_contractbl.h"
-
-GAVL_CUST_NODE_INT_IMP(_fwp_contractbl, fwp_contractbl_t, fwp_contract_data_t,
- unsigned int, cont_tree, tree_node, label, gavl_cmp_int);
-
-void fwp_contractbl_init(struct fwp_contractbl *tbl)
-{
-/* unsigned int i;
-
- for (i = 0; i < FWP_CONTRACT_MAX; i++)
- contractbl->entry[i].status = FWP_CONT_INVALID;*/
-
- tbl->id_counter = 0;
- _fwp_contractbl_init_root_field(tbl);
- tbl->nr_contract = 0;
-}
-
-int fwp_contractbl_insert(fwp_contractbl_t *tbl,
- fwp_contract_data_t *contdata)
-{
- unsigned int id = tbl->id_counter++;
-
- /* obtain fwp ctable mutex */
- /* find free contract */
- contdata->label = id;
- _fwp_contractbl_insert(tbl, contdata);
- tbl->nr_contract++;
- /* release fwp_contractbl mutex */
-
- return id;
-}
-
-fwp_contract_data_t* fwp_contractbl_find(fwp_contractbl_t *tbl, unsigned int id)
-{
- return _fwp_contractbl_find(tbl, &id);
-}
-
-int fwp_contractbl_delete(fwp_contractbl_t *tbl,
- fwp_contract_data_t *contdata)
-{
- int rv;
-
- rv = _fwp_contractbl_delete(tbl, contdata);
- tbl->nr_contract--;
-
- return rv;
-}
-
//#include "admtest.h"
#include "fwp_mngt.h"
-#include "fwp_contractbl.h"
+#include "fwp_contract_table.h"
#include "fwp_admctrl.h"
//static struct sockaddr_un fwp_laddr; /**< FWP local address */
struct fwp_vres_params service_vparams;
unsigned int service_vres_id; /**< id of service vres */
+/* Agent table */
+fwp_agent_table_t agent_table; /**< agent table*/
+
/* Contract table */
-fwp_contractbl_t contractbl; /**< contract table*/
+fwp_contract_table_t contractbl; /**< contract table*/
/* List of requested contracts */
/*fwp_contractlist_t contractlist_req;*/
return 0;
}
+void fwp_mngr_contract_insert(fwp_sockaddr_t *agent_addr,
+ fwp_contract_data_t *contdata)
+{
+ unsigned int addr;
+ struct sockaddr_in *addr_in;
+ fwp_agent_data_t *agdata;
+
+ addr_in = (struct sockaddr_in*) agent_addr->addr;
+ addr = addr_in.sin_addr;
+ agdata = fwp_agent_table_find(&agent_table, &addr);
+ 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);
+ }
+ fwp_contract_table_insert(agdata->contract_tree);
+}
+
void fwp_mngr_msg_handler(struct fwp_msgb *msgb)
{
unsigned int code, hid;
+ fwp_sockaddr_t sockaddr;
fwp_msg_header_inflate(msgb->data, &code, &hid);
fwp_msgb_pull(msgb, sizeof(struct fwp_msg_header));
FWP_DEBUG("code = %d , hid = %d\n", code, hid);
-
+ memcpy(&fwp_sockaddr, msgb->peer, sizeof(fwp_scokaddr_t));
+
switch (code) {
case FWP_CONTNEGT_REQ:
FWP_DEBUG("Negotiation Request received\n");
fwp_mngr_contnegt_request(msgb);
FWP_DEBUG("Executing admission control test\n");
- fwp_admctrl_test(cont_req);
+ fwp_admctrl_test(contract_req);
/* right now simply add to contract table if negotiated */
if (cont_req->status == FWP_CONT_NEGOTIATED) {
- fwp_contractbl_insert(&contractbl, cont_req);
+ fwp_mngr_contract_insert(&msgb->peer, &contract_req);
}
FWP_DEBUG("Preparing NEGT_RES msg\n");
- fwp_mngr_contnegt_response(hid, cont_req);
+ fwp_mngr_contnegt_response(hid, contract_req);
break;
default:
printf("Invalid message\n.");
#include <stdlib.h>
#include <string.h>
-#include "fwp_contractbl.h"
+#include "fwp_contract_table.h"
#include "fwp_msg.h"
#include "fwp_vres.h"
#include "fwp_util.h"