#ifndef NETCLIENT_H #define NETCLIENT_H #include "net.h" #include "hashtable.h" #include #include /* Addresses are set statically, for now. */ #define ANEMONE1 "00:0c:f1:7c:de:25" #define ANEMONE2 "00:07:e9:3d:c3:d2" #define ANEMONE3 "00:0e:0c:5a:f7:3a" #define ANEMONE4 "00:0e:0c:6e:a7:9a" typedef struct Server Server; struct Server{ u8 mac[ETH_ALEN]; ulong avail_mem, total_mem, status, writes, reads, consider; ulong tag; timeval timestamp; struct list_head queue; }; #define _TAG_INIT 1 #define SERVER_MAC ANEMONE1 #define RESET_TIMER() do { \ mod_timer(&pq_timer, jiffies + TIMEOUT);\ atomic64_set(&timerset, 1); \ } while(0) #define PREALLOC_RW (LINK_HDR + MSGSIZE) #define TRAVERSE_REQUEST 0 #define TRAVERSE_TIMER 1 #define TRAVERSE_REPLY 2 #define MAX_RETRIES 5 //maximum number of retransmissions #define REQ_THRESH_UPPER 200 //requests, max outstanding requests #define TIMEOUT 40 //jiffies, show often the timer fires #define RETRANS_TIMEOUT 40 //jiffies, per-packet time before next xmit /* * Anemone4 measurement only: * The number of idle loop + increment cycles needed to produce one * microsecond of latency. */ #define MICROSECOND 1100 /* //#define SPACING 40 //microseconds, min time before next xmit //comment this out to turn off spacing */ extern ulong max_requests, rband, wband, retransmissions, packet_drops, retrans_drops, reads, writes, readlat, writelat, success, spaced, sequence, ctrlcount, servers; extern atomic64_t inflight; extern timeval started; extern kmem_cache_t * pcache; extern HashTable mapping; extern list_head server_list; int toggle_debug(struct file*, const char*, ulong, void*); /* Public Functions */ int client_network_init(void (*read_back) (void *, sk_buff *, ulong, bool, void *), void (*write_back) (void *, void *, bool), void * meta); void client_network_exit(void); int request_anemone(bool write, ulong offset, sk_buff * skb, void *); int anemone_client_recv(sk_buff *); void transmit(Packet *); void traverse_replies(ulong); void callback(Packet *); void timeout(ulong); void try_to_add_space(void); void broadcast_recv_timeout(ulong); void broadcast_session_status(void); void session_timeout(ulong); void get_server_by_tag(ulong tag, Server **s1, Server **s2); Server * get_least_utilized(void); Server * get_second_least_utilized(Server *); void update_server_status(sk_buff *, ulong, ulong, ulong); void dump_server_status(void); bool map_equal(void *x, void *y); ulong map_hash(void *offset); #define PROCNAME2 "cdebug" #endif