summaryrefslogblamecommitdiffstats
path: root/kernel/net.h
blob: 989f430c4539c62ca68675424e79c86ee42720ba (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                 
                          
                           




                                                
















                                                      
                                            







                                                                                
 




























                                                                                
 








                                                                     
 
      
#ifndef LINUX_DNBD_NET_H
#define LINUX_DNBD_NET_H	1

#include <linux/version.h>
#include <linux/spinlock.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
	#include <asm/semaphore.h>
#else
	#include <linux/semaphore.h>
#endif
#include <linux/list.h>
#include <linux/param.h>
#include <linux/jiffies.h>

#define 	SERVERS_MAX		8
#define		SERVER_STALLED		-1
#define		SERVER_INACTIVE		0
#define		SERVER_ACTIVE		1

/* limits and other constants for SRTT calculations */
#define		TIMEOUT_MIN		1
#define		TIMEOUT_MAX		HZ / 4
#define		TIMEOUT_STALLED		5 * HZ
#define		TIMEOUT_SHIFT		2

/* beta is 99% (990/1000) */
#define		SRTT_BETA		990
#define		SRTT_BETA_BASE		1000
#define		SRTT_SHIFT		10

/* normalize weights to 255 as there is no float arithmetic in kernel */
#define		WEIGHT_NORMAL		((1<<8)-1)
#define		WEIGHT_FACTOR		(1<<20)

#define dnbd_rx_update(servers, id) \
if ((id > 0) && (id <= SERVERS_MAX)) servers.serverlist[id-1].last_rx = jiffies;

#define dnbd_tx_update(servers, id) \
if ((id > 0) && (id <= SERVERS_MAX)) servers.serverlist[id-1].last_tx = jiffies;

/* characteristics of a server */
struct dnbd_server {
	int id;
	int state;
	int srtt;
	int weight;
	unsigned long last_rx;		/* in jiffies */
	unsigned long last_tx;		/* in jiffies */
};

typedef struct dnbd_server dnbd_server_t;

/* common server information and helper variables */
struct dnbd_servers {
	struct dnbd_server *serverlist;
	struct dnbd_server *server;
	spinlock_t lock;
	struct semaphore sema;
	int timeout_min;
	int timeout_max;
	int timeout_stalled;
	int asrtt;
	int count;
};

typedef struct dnbd_servers dnbd_servers_t;

/* functions */
int dnbd_set_serverid(dnbd_servers_t * servers, int id);
int dnbd_next_server(dnbd_servers_t * servers);
void dnbd_rem_servers(dnbd_servers_t * servers);
void dnbd_rtt_server(dnbd_servers_t * servers, int id, int rtt);
int dnbd_servers_init(dnbd_servers_t *servers);
void dnbd_servers_weight(dnbd_servers_t * servers);
int dnbd_show_servers(dnbd_servers_t * servers, void *buf, int size);
void dnbd_clean_servers(dnbd_servers_t * servers);

#endif