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 
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 */
265