#ifndef NETDUMPCLIENT_H
#define NETDUMPCLIENT_H

#include <glib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "netconsole.h"

typedef struct _NetdumpClient NetdumpClient;

#define MAGIC_SIZE 8

#define IP_ADDR_SIZE 16  /* "255:255:255:255\0" */

typedef struct {
  guint32 page_nr;
  char   *data;
  guint32 sections_received;
  guint32 request_nr;
  guint   n_timeouts;
  guint   timeout_tag;
  guint   timeout_delay;
} OutstandingPage;

struct _NetdumpClient {
  guint32 ip;
  gboolean just_reboot;
  
  guint32 outstanding_request;
  guint   timeout_tag;
  guint   n_timeouts;
  guint   n_handshakes;
  guint   timeout_delay;

  gboolean got_log_packet;
  
  unsigned char magic_value[MAGIC_SIZE];
  
  /* Host data */
  guint32 nr_pages;  /* max page frame number */
  guint32 page_size;
  guint64 page_offset;

  /* Version 5 additions */
  u32 effective_version;
  u32 machine_type;
  u32 totalram_pages;
  u32 next_avail_page;
  u64 task_struct;
  u64 netdump_magic;
  unsigned char ip_addr[IP_ADDR_SIZE]; /* for syslog strings only */

  gchar  *regs;
  guint   regs_len;
  
  guint32 current_page;
  OutstandingPage *outstanding;
  int     n_outstanding;
  
  void (*timeout)        (NetdumpClient *client,
			  guint32        request_nr);
  void (*process_packet) (NetdumpClient *client,
			  struct sockaddr_in *addr,
			  unsigned char *buffer,
			  int buf_len);


  /* Coredump data: */
  int    dump_fd;
  size_t data_offset;

  char *dump_dir;
};


NetdumpClient *netdump_client_new     (guint32        ip,
				       const char    *dir,
				       const char     magic[MAGIC_SIZE],
				       gboolean       just_reboot,
				       reply_t 	     *reply,
				       char          *msg);
void           netdump_client_destroy (NetdumpClient *client,
				       int reboot);
guint          netdump_client_hash    (gconstpointer  key);
gint           netdump_client_compare (gconstpointer  a,
				       gconstpointer  b);


#endif


syntax highlighted by Code2HTML, v. 0.9.1