/******************************************************************************/
/************************** MM-Prot *******************************************/
/******************************************************************************/

#define STRLEN 256
#define TAG_LEN 6
#define ALPHA 0.3

#define MIN(x,y) ((x)<(y))?(x):(y)


typedef struct mm_client {
  struct sockaddr_in  client;
  char                hostname[STRLEN];  //convenience
  int                 port;       //detto

  char                file[STRLEN];
  FILE                *fp;
  long                fpos;
  long                rate;  //byte per second
  long                usecs; //how long did the last rate-serve take?
  long                avg_usecs;
  struct mm_client    *prev;
  struct mm_client    *next;
} mm_client;


typedef struct mm_stats {
  float   avg_bytes_per_usec;
  long   sum_usecs;
  long   avg_sum_usecs;
  long   sum_bytes;
  int    num_clients;
  long   remaining_time;
  long   adjust;
  long   avg_adjust;
  long   algo_time;
  long   cycles;
  long   working_time;
  long   sum_working_time;
} mm_stats;


typedef struct header_tag {
  char    tag[TAG_LEN];
} header_tag;


typedef struct hello_pkt {
  char    tag[TAG_LEN];
  char    file[STRLEN];
  long    fpos;
  long    rate;
} hello_pkt;

typedef struct accept_pkt {
  char    tag[TAG_LEN];
} accept_pkt;

typedef struct reject_pkt {
  char    tag[TAG_LEN];
} reject_pkt;

typedef struct end_pkt {
  char    tag[TAG_LEN];
} end_pkt;

