aboutsummaryrefslogblamecommitdiffstats
path: root/libglouglou/libggnet.h
blob: 794639bbc374485f290616be470a9ee593ccaa8d (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                    


                       



                         





                          
                            
                                                                          
 

                                   



                              



                      



                                          
                                       
                                      
                            




                                         
  
 

                                     
                          






                                                                                    









                                     
                   
                                   








                               




                                          
                                                

                           
                                                         

                                 
                     
                      
                      
                             


                                                                                                   

                                 
                                                                    

  
                                        











                                                                   
                                                                          
                                                                             
                                                                           


                                                                             
                                                                              



                                                                             
                                                                               
                                                                   

                                                                    








                                                                               

                         
#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_ */