1/*********************************************************************
2 *
3 * Filename:      irda.h
4 * Version:       1.0
5 * Description:   IrDA common include file for kernel internal use
6 * Status:        Stable
7 * Author:        Dag Brattli <dagb@cs.uit.no>
8 * Created at:    Tue Dec  9 21:13:12 1997
9 * Modified at:   Fri Jan 28 13:16:32 2000
10 * Modified by:   Dag Brattli <dagb@cs.uit.no>
11 *
12 *     Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
13 *     Copyright (c) 2000-2001 Jean Tourrilhes <jt@hpl.hp.com>
14 *
15 *     This program is free software; you can redistribute it and/or
16 *     modify it under the terms of the GNU General Public License as
17 *     published by the Free Software Foundation; either version 2 of
18 *     the License, or (at your option) any later version.
19 *
20 *     Neither Dag Brattli nor University of Troms� admit liability nor
21 *     provide warranty for any of this software. This material is
22 *     provided "AS-IS" and at no charge.
23 *
24 ********************************************************************/
25
26#ifndef NET_IRDA_H
27#define NET_IRDA_H
28
29#include <linux/config.h>
30#include <linux/skbuff.h>
31#include <linux/kernel.h>
32#include <linux/if.h>
33#include <linux/irda.h>
34
35typedef __u32 magic_t;
36
37#include <net/irda/qos.h>
38#include <net/irda/irqueue.h>
39
40#ifndef TRUE
41#define TRUE 1
42#endif
43
44#ifndef FALSE
45#define FALSE 0
46#endif
47
48/* Hack to do small backoff when setting media busy in IrLAP */
49#ifndef SMALL
50#define SMALL 5
51#endif
52
53#ifndef IRDA_MIN     /* Lets not mix this MIN with other header files */
54#define IRDA_MIN(a, b) (((a) < (b)) ? (a) : (b))
55#endif
56
57#ifndef ALIGN
58#  define ALIGN __attribute__((aligned))
59#endif
60#ifndef PACK
61#  define PACK __attribute__((packed))
62#endif
63
64
65#ifdef CONFIG_IRDA_DEBUG
66
67extern __u32 irda_debug;
68
69/* use 0 for production, 1 for verification, >2 for debug */
70#define IRDA_DEBUG_LEVEL 0
71
72#define IRDA_DEBUG(n, args...) (irda_debug >= (n)) ? (printk(KERN_DEBUG args)) : 0
73#define ASSERT(expr, func) \
74if(!(expr)) { \
75        printk( "Assertion failed! %s:%s:%d %s\n", \
76        __FILE__,__FUNCTION__,__LINE__,(#expr));  \
77        func }
78#else
79#define IRDA_DEBUG(n, args...)
80#define ASSERT(expr, func) \
81if(!(expr)) do { \
82        func } while (0)
83#endif /* CONFIG_IRDA_DEBUG */
84
85#define WARNING(args...) printk(KERN_WARNING args)
86#define MESSAGE(args...) printk(KERN_INFO args)
87#define ERROR(args...)   printk(KERN_ERR args)
88
89#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000)
90
91/*
92 *  Magic numbers used by Linux-IrDA. Random numbers which must be unique to
93 *  give the best protection
94 */
95
96#define IRTTY_MAGIC        0x2357
97#define LAP_MAGIC          0x1357
98#define LMP_MAGIC          0x4321
99#define LMP_LSAP_MAGIC     0x69333
100#define LMP_LAP_MAGIC      0x3432
101#define IRDA_DEVICE_MAGIC  0x63454
102#define IAS_MAGIC          0x007
103#define TTP_MAGIC          0x241169
104#define TTP_TSAP_MAGIC     0x4345
105#define IROBEX_MAGIC       0x341324
106#define HB_MAGIC           0x64534
107#define IRLAN_MAGIC        0x754
108#define IAS_OBJECT_MAGIC   0x34234
109#define IAS_ATTRIB_MAGIC   0x45232
110#define IRDA_TASK_MAGIC    0x38423
111
112#define IAS_DEVICE_ID 0x0000 /* Defined by IrDA, IrLMP section 4.1 (page 68) */
113#define IAS_PNP_ID    0xd342
114#define IAS_OBEX_ID   0x34323
115#define IAS_IRLAN_ID  0x34234
116#define IAS_IRCOMM_ID 0x2343
117#define IAS_IRLPT_ID  0x9876
118
119typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
120
121/* A few forward declarations (to make compiler happy) */
122struct tsap_cb;		/* in <net/irda/irttp.h> */
123struct lsap_cb;		/* in <net/irda/irlmp.h> */
124struct iriap_cb;	/* in <net/irda/iriap.h> */
125struct ias_value;	/* in <net/irda/irias_object.h> */
126struct discovery_t;	/* in <net/irda/discovery.h> */
127
128/* IrDA Socket */
129struct irda_sock {
130	__u32 saddr;          /* my local address */
131	__u32 daddr;          /* peer address */
132
133	struct lsap_cb *lsap; /* LSAP used by Ultra */
134	__u8  pid;            /* Protocol IP (PID) used by Ultra */
135
136	struct tsap_cb *tsap; /* TSAP used by this connection */
137	__u8 dtsap_sel;       /* remote TSAP address */
138	__u8 stsap_sel;       /* local TSAP address */
139
140	__u32 max_sdu_size_rx;
141	__u32 max_sdu_size_tx;
142	__u32 max_data_size;
143	__u8  max_header_size;
144	struct qos_info qos_tx;
145
146	__u16 mask;           /* Hint bits mask */
147	__u16 hints;          /* Hint bits */
148
149	__u32 ckey;           /* IrLMP client handle */
150	__u32 skey;           /* IrLMP service handle */
151
152	struct ias_object *ias_obj;   /* Our service name + lsap in IAS */
153	struct iriap_cb *iriap;	      /* Used to query remote IAS */
154	struct ias_value *ias_result; /* Result of remote IAS query */
155
156	hashbin_t *cachelog;		/* Result of discovery query */
157	struct discovery_t *cachediscovery;	/* Result of selective discovery query */
158
159	int nslots;           /* Number of slots to use for discovery */
160
161	int errno;            /* status of the IAS query */
162
163	struct sock *sk;
164	wait_queue_head_t query_wait;	/* Wait for the answer to a query */
165	struct timer_list watchdog;	/* Timeout for discovery */
166
167	LOCAL_FLOW tx_flow;
168	LOCAL_FLOW rx_flow;
169};
170
171/*
172 *  This type is used by the protocols that transmit 16 bits words in
173 *  little endian format. A little endian machine stores MSB of word in
174 *  byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0]
175 *  and LSB in byte[1].
176 */
177typedef union {
178	__u16 word;
179	__u8  byte[2];
180} __u16_host_order;
181
182/*
183 * Per-packet information we need to hide inside sk_buff
184 * (must not exceed 48 bytes, check with struct sk_buff)
185 */
186struct irda_skb_cb {
187	magic_t magic;       /* Be sure that we can trust the information */
188	__u32   next_speed;  /* The Speed to be set *after* this frame */
189	__u16   mtt;         /* Minimum turn around time */
190	__u16   xbofs;       /* Number of xbofs required, used by SIR mode */
191	__u16   next_xbofs;  /* Number of xbofs required *after* this frame */
192	void    *context;    /* May be used by drivers */
193	void    (*destructor)(struct sk_buff *skb); /* Used for flow control */
194	__u16   xbofs_delay; /* Number of xbofs used for generating the mtt */
195	__u8    line;        /* Used by IrCOMM in IrLPT mode */
196};
197
198/* Misc status information */
199typedef enum {
200	STATUS_OK,
201	STATUS_ABORTED,
202	STATUS_NO_ACTIVITY,
203	STATUS_NOISY,
204	STATUS_REMOTE,
205} LINK_STATUS;
206
207typedef enum {
208	LOCK_NO_CHANGE,
209	LOCK_LOCKED,
210	LOCK_UNLOCKED,
211} LOCK_STATUS;
212
213typedef enum {
214	LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
215	LAP_NO_RESPONSE,       /* To many retransmits without response */
216	LAP_RESET_INDICATION,  /* To many retransmits, or invalid nr/ns */
217	LAP_FOUND_NONE,        /* No devices were discovered */
218	LAP_MEDIA_BUSY,
219	LAP_PRIMARY_CONFLICT,
220} LAP_REASON;
221
222/*
223 *  IrLMP disconnect reasons. The order is very important, since they
224 *  correspond to disconnect reasons sent in IrLMP disconnect frames, so
225 *  please do not touch :-)
226 */
227typedef enum {
228	LM_USER_REQUEST = 1,  /* User request */
229	LM_LAP_DISCONNECT,    /* Unexpected IrLAP disconnect */
230	LM_CONNECT_FAILURE,   /* Failed to establish IrLAP connection */
231	LM_LAP_RESET,         /* IrLAP reset */
232	LM_INIT_DISCONNECT,   /* Link Management initiated disconnect */
233	LM_LSAP_NOTCONN,      /* Data delivered on unconnected LSAP */
234	LM_NON_RESP_CLIENT,   /* Non responsive LM-MUX client */
235	LM_NO_AVAIL_CLIENT,   /* No available LM-MUX client */
236	LM_CONN_HALF_OPEN,    /* Connection is half open */
237	LM_BAD_SOURCE_ADDR,   /* Illegal source address (i.e 0x00) */
238} LM_REASON;
239#define LM_UNKNOWN 0xff       /* Unspecified disconnect reason */
240
241/*
242 *  Notify structure used between transport and link management layers
243 */
244typedef struct {
245	int (*data_indication)(void *priv, void *sap, struct sk_buff *skb);
246	int (*udata_indication)(void *priv, void *sap, struct sk_buff *skb);
247	void (*connect_confirm)(void *instance, void *sap,
248				struct qos_info *qos, __u32 max_sdu_size,
249				__u8 max_header_size, struct sk_buff *skb);
250	void (*connect_indication)(void *instance, void *sap,
251				   struct qos_info *qos, __u32 max_sdu_size,
252				   __u8 max_header_size, struct sk_buff *skb);
253	void (*disconnect_indication)(void *instance, void *sap,
254				      LM_REASON reason, struct sk_buff *);
255	void (*flow_indication)(void *instance, void *sap, LOCAL_FLOW flow);
256	void (*status_indication)(void *instance,
257				  LINK_STATUS link, LOCK_STATUS lock);
258	void *instance; /* Layer instance pointer */
259	char name[16];  /* Name of layer */
260} notify_t;
261
262#define NOTIFY_MAX_NAME 16
263
264#endif /* NET_IRDA_H */
265