|
|
|
/*
|
|
|
|
* 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 */
|
|
|
|
void * 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 *,
|
|
|
|
__u16);
|
|
|
|
/* ----------------------- 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(discinfo_t *,
|
|
|
|
DISCOVERY_MODE,
|
|
|
|
void *);
|
|
|
|
static void
|
|
|
|
irnet_expiry_indication(discinfo_t *,
|
|
|
|
DISCOVERY_MODE,
|
|
|
|
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 */
|