summaryrefslogtreecommitdiffstats
path: root/kernel/net.h
blob: cdd79966601c5cfec18c3c222b4263991fb05525 (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
#ifndef LINUX_DNBD_NET_H
#define LINUX_DNBD_NET_H	1

#include <linux/spinlock.h>
#include <asm/semaphore.h>
#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