aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/libggnet.h
blob: 3caea7cbc35f7ef044609abe92e8e595136f116c (plain) (blame)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#ifndef _LIBGGNET_H_
#define _LIBGGNET_H_

#include <sys/types.h>
#include <netinet/in.h>

#include <event2/dns.h>
#include <event2/util.h>
#include <event2/event.h>

#if defined(__OpenBSD__)
#include <sys/queue.h>
#else
#include <bsd/sys/queue.h>
#endif

#define GGNET_DNSNAME_MAX 60
#define GGNET_CONN_FREEIDS_COUNT 65536 /* 2^16 as freeids are u_int16_t */

#define GGNET_MANAGE_CONNID_TRUE 1
#define GGNET_MANAGE_CONNID_FALSE 0
#define GGNET_GROUPING_TRUE 1
#define GGNET_GROUPING_FALSE 1

enum ggnet_grouptype {
	GROUP_ADDRESS,
	GROUP_WHOIS,
	GROUP_DNS,
	GROUP_ROUTE
};

struct ggnet_nodegroup {
	LIST_ENTRY(ggnet_nodegroup) entry;
	struct ggnet_nodegroup *parent;
	enum ggnet_grouptype type;
	struct in_addr addr;
	char name[GGNET_DNSNAME_MAX];
	int node_count;
	int conn_count;
	int child_groups_count;
	void *usrdata;
};

struct ggnet_node {
	LIST_ENTRY(ggnet_node) entry;
	struct ggnet *net;
	struct in_addr addr;
	time_t lastseen;
	int    used;
	char   fqdn[GGNET_DNSNAME_MAX];
	struct ggnet_nodegroup *group; /* XXX for now we support only one group */
	struct ggnet_dns_req *dns_req;
	void  *usrdata;
};

enum ggnet_connstate {
	CONNSTATE_ESTABLISHED,
	CONNSTATE_TCPFIN,
	CONNSTATE_TCPFIN2
};

struct ggnet_conn {
	LIST_ENTRY(ggnet_conn) entry;
	u_int	id;
	enum ggnet_connstate state;
	struct ggnet_node *src;
	u_int	src_port;
	struct ggnet_node *dst;
	u_int	dst_port;
	u_int	proto;
	u_int	size;
	u_int	size_response;
	time_t	lastseen;
	void	*usrdata;
};

struct ggnet {
	LIST_HEAD(, ggnet_conn) conn_list;
	LIST_HEAD(, ggnet_node) node_list;
	LIST_HEAD(, ggnet_nodegroup) group_list;
	int		conn_count;
	int		node_count;
	u_int16_t conn_freeids[GGNET_CONN_FREEIDS_COUNT];
	int		conn_freeids_ptr;
	int		manage_connid;
	time_t	time;
	int		debug;
	/* grouping */
	int		use_grouping;
	void	(*cb_addgroup)(struct ggnet *, struct ggnet_nodegroup *, struct ggnet_nodegroup *);
	void	(*cb_delgroup)(struct ggnet *, struct ggnet_nodegroup *);
	/* dns */
	int		use_dns;
	struct ggnet_dns *ggdns;
	void	(*cb_nodename)(struct ggnet *, struct ggnet_node *);
};

struct ggnet		*ggnet_new(int);
void				 ggnet_set_grouping(struct ggnet *, int,
						void (*cb_addgroup)(struct ggnet *,
							struct ggnet_nodegroup *,
							struct ggnet_nodegroup *),
						void (*cb_delgroup)(struct ggnet *,
							struct ggnet_nodegroup *));
void				 ggnet_set_dns(struct ggnet *net, int set,
						struct event_base *ev_base,
						void (*cb_nodename)(struct ggnet *,
							struct ggnet_node *));
void				 ggnet_debug_set(struct ggnet *, int);
void				 ggnet_free(struct ggnet *);
struct ggnet_node	*ggnet_node_add(struct ggnet *, struct in_addr *);
void				 ggnet_node_del(struct ggnet *, struct ggnet_node *);
struct ggnet_node	*ggnet_node_find(struct ggnet *, struct in_addr *);
void				*ggnet_node_usrdata_get(struct ggnet_node *);
void				 ggnet_node_usrdata_set(struct ggnet_node *, void *);
struct ggnet_nodegroup *ggnet_node_group_get(struct ggnet_node *);
struct ggnet_conn	*ggnet_conn_add(struct ggnet *, struct in_addr *, int,
						struct in_addr *, int, int, int, int);
void				 ggnet_conn_data(struct ggnet *, struct ggnet_conn *,
						int, int);
void				 ggnet_conn_del(struct ggnet *, struct ggnet_conn *);
struct ggnet_conn	*ggnet_conn_find(struct ggnet *, struct in_addr *, int,
						struct in_addr *, int, int, int *);
struct ggnet_conn	*ggnet_conn_find_by_id(struct ggnet *, int);
struct ggnet_conn	*ggnet_conn_find_by_node(struct ggnet *,
						struct ggnet_node *, struct ggnet_node *);
void				*ggnet_conn_usrdata_get(struct ggnet_conn *);
void				 ggnet_conn_usrdata_set(struct ggnet_conn *, void *);
void				*ggnet_conn_src_get(struct ggnet_conn *);
void				*ggnet_conn_dst_get(struct ggnet_conn *);
void				*ggnet_nodegroup_usrdata_get(struct ggnet_nodegroup *);
void				 ggnet_nodegroup_usrdata_set(struct ggnet_nodegroup *,
						void *);
void				 ggnet_time_update(struct ggnet *, time_t);

#endif /* _LIBGGNET_H_ */