1 |
1275 |
phoenix |
/*********************************************************************
|
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 |
|
|
|
35 |
|
|
typedef __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 |
|
|
|
67 |
|
|
extern __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) \
|
74 |
|
|
if(!(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) \
|
81 |
|
|
if(!(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 |
|
|
|
119 |
|
|
typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
|
120 |
|
|
|
121 |
|
|
/* A few forward declarations (to make compiler happy) */
|
122 |
|
|
struct tsap_cb; /* in <net/irda/irttp.h> */
|
123 |
|
|
struct lsap_cb; /* in <net/irda/irlmp.h> */
|
124 |
|
|
struct iriap_cb; /* in <net/irda/iriap.h> */
|
125 |
|
|
struct ias_value; /* in <net/irda/irias_object.h> */
|
126 |
|
|
struct discovery_t; /* in <net/irda/discovery.h> */
|
127 |
|
|
|
128 |
|
|
/* IrDA Socket */
|
129 |
|
|
struct 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 |
|
|
*/
|
177 |
|
|
typedef 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 |
|
|
*/
|
186 |
|
|
struct 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 */
|
199 |
|
|
typedef enum {
|
200 |
|
|
STATUS_OK,
|
201 |
|
|
STATUS_ABORTED,
|
202 |
|
|
STATUS_NO_ACTIVITY,
|
203 |
|
|
STATUS_NOISY,
|
204 |
|
|
STATUS_REMOTE,
|
205 |
|
|
} LINK_STATUS;
|
206 |
|
|
|
207 |
|
|
typedef enum {
|
208 |
|
|
LOCK_NO_CHANGE,
|
209 |
|
|
LOCK_LOCKED,
|
210 |
|
|
LOCK_UNLOCKED,
|
211 |
|
|
} LOCK_STATUS;
|
212 |
|
|
|
213 |
|
|
typedef enum { /* FIXME check the two first reason codes */
|
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 |
|
|
*/
|
227 |
|
|
typedef 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 |
|
|
*/
|
244 |
|
|
typedef 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 */
|