/*
 *	IrNET protocol module : Synchronous PPP over an IrDA socket.
 *
 *		Jean II - HPL `00 - <jt@hpl.hp.com>
 *
 * This file contains all definitions and declarations necessary for the
 * IRDA part of the IrNET module (dealing with IrTTP, IrIAS and co).
 * This file is a private header, so other modules don't want to know
 * what's in there...
 */

#ifndef IRNET_IRDA_H
#define IRNET_IRDA_H

/***************************** INCLUDES *****************************/
/* Please add other headers in irnet.h */

#include "irnet.h"		/* Module global include */

/************************ CONSTANTS & MACROS ************************/

/*
 * Name of the service (socket name) used by IrNET
 */
/* IAS object name (or part of it) */
#define IRNET_SERVICE_NAME	"IrNetv1"
/* IAS attribute */
#define IRNET_IAS_VALUE		"IrDA:TinyTP:LsapSel"
/* LMP notify name for client (only for /proc/net/irda/irlmp) */
#define IRNET_NOTIFY_NAME	"IrNET socket"
/* LMP notify name for server (only for /proc/net/irda/irlmp) */
#define IRNET_NOTIFY_NAME_SERV	"IrNET server"

/****************************** TYPES ******************************/

/*
 * This is the main structure where we store all the data pertaining to
 * the IrNET server (listen for connection requests) and the root
 * of the IrNET socket list
 */
typedef struct irnet_root
{
  irnet_socket		s;		/* To pretend we are a client... */

  /* Generic stuff */
  int			magic;		/* Paranoia */
  int			running;	/* Are we operational ? */

  /* Link list of all IrNET instances opened */
  hashbin_t *		list;
  spinlock_t		spinlock;	/* Serialize access to the list */
  /* Note : the way hashbin has been designed is absolutely not
   * reentrant, beware... So, we blindly protect all with spinlock */

  /* Handle for the hint bit advertised in IrLMP */
  __u32			skey;

  /* Server socket part */
  struct ias_object *	ias_obj;	/* Our service name + lsap in IAS */

} irnet_root;


/**************************** PROTOTYPES ****************************/

/* ----------------------- CONTROL CHANNEL ----------------------- */
static void
	irnet_post_event(irnet_socket *,
			 irnet_event,
			 __u32,
			 __u32,
			 char *);
/* ----------------------- IRDA SUBROUTINES ----------------------- */
static inline int
	irnet_open_tsap(irnet_socket *);
static inline __u8
	irnet_ias_to_tsap(irnet_socket *,
			  int,
			  struct ias_value *);
static inline int
	irnet_find_lsap_sel(irnet_socket *);
static inline int
	irnet_connect_tsap(irnet_socket *);
static inline int
	irnet_discover_next_daddr(irnet_socket *);
static inline int
	irnet_discover_daddr_and_lsap_sel(irnet_socket *);
static inline int
	irnet_dname_to_daddr(irnet_socket *);
/* ------------------------ SERVER SOCKET ------------------------ */
static inline int
	irnet_daddr_to_dname(irnet_socket *);
static inline irnet_socket *
	irnet_find_socket(irnet_socket *);
static inline int
	irnet_connect_socket(irnet_socket *,
			     irnet_socket *,
			     struct qos_info *,
			     __u32,
			     __u8);
static inline void
	irnet_disconnect_server(irnet_socket *,
				struct sk_buff *);
static inline int
	irnet_setup_server(void);
static inline void
	irnet_destroy_server(void);
/* ---------------------- IRDA-TTP CALLBACKS ---------------------- */
static int
	irnet_data_indication(void *,		/* instance */
			      void *,		/* sap */
			      struct sk_buff *);
static void
	irnet_disconnect_indication(void *,
				    void *,
				    LM_REASON,
				    struct sk_buff *);
static void
	irnet_connect_confirm(void *,
			      void *,
			      struct qos_info *,
			      __u32,
			      __u8,
			      struct sk_buff *);
static void
	irnet_flow_indication(void *,
			      void *,
			      LOCAL_FLOW);
static void
	irnet_status_indication(void *,
				LINK_STATUS,
				LOCK_STATUS);
static void
	irnet_connect_indication(void *,
				 void *,
				 struct qos_info *,
				 __u32,
				 __u8,
				 struct sk_buff *);
/* -------------------- IRDA-IAS/LMP CALLBACKS -------------------- */
static void
	irnet_getvalue_confirm(int,
			       __u16,
			       struct ias_value *,
			       void *);
static void
	irnet_discovervalue_confirm(int,
				    __u16, 
				    struct ias_value *,
				    void *);
#ifdef DISCOVERY_EVENTS
static void
	irnet_discovery_indication(discovery_t *,
				   void *);
static void
	irnet_expiry_indication(discovery_t *,
				void *);
#endif
/* -------------------------- PROC ENTRY -------------------------- */
#ifdef CONFIG_PROC_FS
static int
	irnet_proc_read(char *,
			char **,
			off_t,
			int);
#endif /* CONFIG_PROC_FS */

/**************************** VARIABLES ****************************/

/*
 * The IrNET server. Listen to connection requests and co...
 */
static struct irnet_root	irnet_server;

/* Control channel stuff (note : extern) */
struct irnet_ctrl_channel	irnet_events;

/* The /proc/net/irda directory, defined elsewhere... */
#ifdef CONFIG_PROC_FS
extern struct proc_dir_entry *proc_irda;
#endif /* CONFIG_PROC_FS */

#endif /* IRNET_IRDA_H */
