-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgraph.h
107 lines (82 loc) · 2.1 KB
/
graph.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef __GRAPH__
#define __GRAPH__
#include "glthreads.h"
#include "net.h"
#define IF_NAME_SIZE 16
#define NODE_NAME_SIZE 16
#define MAX_INTF_PER_NODE 10
/*Forward declaration*/
typedef struct node_ node_t;
typedef struct link_ link_t;
typedef struct interface_ {
char if_name[IF_NAME_SIZE];
struct link_t *link;
struct node_ *attr_node;
intf_nw_prop_t intf_nw_prop;
}interface_t;
struct link_ {
interface_t intf1;
interface_t intf2;
unsigned int cost;
};
struct node_ {
char node_name[NODE_NAME_SIZE];
interface_t *intf[MAX_INTF_PER_NODE];
node_nw_prop_t node_nw_prop;
unsigned int udp_port_number;
int udp_sock_fd;
gl_thread_t graph_glue;
};
typedef struct graph_ {
char topology_name[32];
gl_thread_t node_list;
}graph_t;
graph_t*
create_new_graph(char* topology_name);
node_t*
create_graph_node(graph_t* graph, char* node_name);
void
insert_link_between_two_nodes(node_t* n1, node_t* n2, char* to_intf, char* from_intf, unsigned int cost);
void
dump_node(node_t* node);
void
dump_intf(interface_t* intf);
//#define GET_NODE(curr) (node_t*)((char*)curr - offsetof(node_t, graph_glue))
GLTHREAD_TO_STRUCT(graph_glue_to_node, node_t, graph_glue);
static inline int
find_intf_available_slot(node_t *node) {
for(int i=0; i<MAX_INTF_PER_NODE; i++) {
if(node->intf[i] != NULL)
continue;
return i;
}
return -1;
}
static inline interface_t*
get_node_intf_by_name(node_t* node, char* local_if) {
interface_t* intf;
for(int i=0;i < MAX_INTF_PER_NODE; i++) {
intf = node->intf[i];
if (intf == NULL) {
return NULL;
}
if(strncmp(intf->if_name, local_if, IF_NAME_SIZE) == 0)
return intf;
}
return NULL;
}
static inline node_t*
get_node_by_node_name(graph_t* topo, char* node_name) {
node_t *node;
gl_thread_t* curr;
ITERATE_GLTHREAD_BEGIN(&topo->node_list, curr) {
node = graph_glue_to_node(curr);
if(strncmp(node->node_name, node_name, strlen(node_name)) == 0)
return node;
} ITERATE_GLTHREAD_END(&topo->node_list, curr);
return NULL;
}
void dump_graph(graph_t* topo);
void dump_node(node_t* node);
void dump_intf(interface_t* intf);
#endif