Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
This commit is contained in:
87
include/net/irda/af_irda.h
Normal file
87
include/net/irda/af_irda.h
Normal file
@@ -0,0 +1,87 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: af_irda.h
|
||||
* Version: 1.0
|
||||
* Description: IrDA sockets declarations
|
||||
* Status: Stable
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Dec 9 21:13:12 1997
|
||||
* Modified at: Fri Jan 28 13:16:32 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef AF_IRDA_H
|
||||
#define AF_IRDA_H
|
||||
|
||||
#include <linux/irda.h>
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/iriap.h> /* struct iriap_cb */
|
||||
#include <net/irda/irias_object.h> /* struct ias_value */
|
||||
#include <net/irda/irlmp.h> /* struct lsap_cb */
|
||||
#include <net/irda/irttp.h> /* struct tsap_cb */
|
||||
#include <net/irda/discovery.h> /* struct discovery_t */
|
||||
#include <net/sock.h>
|
||||
|
||||
/* IrDA Socket */
|
||||
struct irda_sock {
|
||||
/* struct sock has to be the first member of irda_sock */
|
||||
struct sock sk;
|
||||
__u32 saddr; /* my local address */
|
||||
__u32 daddr; /* peer address */
|
||||
|
||||
struct lsap_cb *lsap; /* LSAP used by Ultra */
|
||||
__u8 pid; /* Protocol IP (PID) used by Ultra */
|
||||
|
||||
struct tsap_cb *tsap; /* TSAP used by this connection */
|
||||
__u8 dtsap_sel; /* remote TSAP address */
|
||||
__u8 stsap_sel; /* local TSAP address */
|
||||
|
||||
__u32 max_sdu_size_rx;
|
||||
__u32 max_sdu_size_tx;
|
||||
__u32 max_data_size;
|
||||
__u8 max_header_size;
|
||||
struct qos_info qos_tx;
|
||||
|
||||
__u16_host_order mask; /* Hint bits mask */
|
||||
__u16_host_order hints; /* Hint bits */
|
||||
|
||||
void *ckey; /* IrLMP client handle */
|
||||
void *skey; /* IrLMP service handle */
|
||||
|
||||
struct ias_object *ias_obj; /* Our service name + lsap in IAS */
|
||||
struct iriap_cb *iriap; /* Used to query remote IAS */
|
||||
struct ias_value *ias_result; /* Result of remote IAS query */
|
||||
|
||||
hashbin_t *cachelog; /* Result of discovery query */
|
||||
__u32 cachedaddr; /* Result of selective discovery query */
|
||||
|
||||
int nslots; /* Number of slots to use for discovery */
|
||||
|
||||
int errno; /* status of the IAS query */
|
||||
|
||||
wait_queue_head_t query_wait; /* Wait for the answer to a query */
|
||||
struct timer_list watchdog; /* Timeout for discovery */
|
||||
|
||||
LOCAL_FLOW tx_flow;
|
||||
LOCAL_FLOW rx_flow;
|
||||
};
|
||||
|
||||
static inline struct irda_sock *irda_sk(struct sock *sk)
|
||||
{
|
||||
return (struct irda_sock *)sk;
|
||||
}
|
||||
|
||||
#endif /* AF_IRDA_H */
|
29
include/net/irda/crc.h
Normal file
29
include/net/irda/crc.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: crc.h
|
||||
* Version:
|
||||
* Description: CRC routines
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Aug 4 20:40:53 1997
|
||||
* Modified at: Sun May 2 20:25:23 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRDA_CRC_H
|
||||
#define IRDA_CRC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/crc-ccitt.h>
|
||||
|
||||
#define INIT_FCS 0xffff /* Initial FCS value */
|
||||
#define GOOD_FCS 0xf0b8 /* Good final FCS value */
|
||||
|
||||
/* Recompute the FCS with one more character appended. */
|
||||
#define irda_fcs(fcs, c) crc_ccitt_byte(fcs, c)
|
||||
|
||||
/* Recompute the FCS with len bytes appended. */
|
||||
#define irda_calc_crc16(fcs, buf, len) crc_ccitt(fcs, buf, len)
|
||||
|
||||
#endif
|
100
include/net/irda/discovery.h
Normal file
100
include/net/irda/discovery.h
Normal file
@@ -0,0 +1,100 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: discovery.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Apr 6 16:53:53 1999
|
||||
* Modified at: Tue Oct 5 10:05:10 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef DISCOVERY_H
|
||||
#define DISCOVERY_H
|
||||
|
||||
#include <asm/param.h>
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/irqueue.h> /* irda_queue_t */
|
||||
#include <net/irda/irlap_event.h> /* LAP_REASON */
|
||||
|
||||
#define DISCOVERY_EXPIRE_TIMEOUT (2*sysctl_discovery_timeout*HZ)
|
||||
#define DISCOVERY_DEFAULT_SLOTS 0
|
||||
|
||||
/*
|
||||
* This type is used by the protocols that transmit 16 bits words in
|
||||
* little endian format. A little endian machine stores MSB of word in
|
||||
* byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0]
|
||||
* and LSB in byte[1].
|
||||
*
|
||||
* This structure is used in the code for things that are endian neutral
|
||||
* but that fit in a word so that we can manipulate them efficiently.
|
||||
* By endian neutral, I mean things that are really an array of bytes,
|
||||
* and always used as such, for example the hint bits. Jean II
|
||||
*/
|
||||
typedef union {
|
||||
__u16 word;
|
||||
__u8 byte[2];
|
||||
} __u16_host_order;
|
||||
|
||||
/* Same purpose, different application */
|
||||
#define u16ho(array) (* ((__u16 *) array))
|
||||
|
||||
/* Types of discovery */
|
||||
typedef enum {
|
||||
DISCOVERY_LOG, /* What's in our discovery log */
|
||||
DISCOVERY_ACTIVE, /* Doing our own discovery on the medium */
|
||||
DISCOVERY_PASSIVE, /* Peer doing discovery on the medium */
|
||||
EXPIRY_TIMEOUT, /* Entry expired due to timeout */
|
||||
} DISCOVERY_MODE;
|
||||
|
||||
#define NICKNAME_MAX_LEN 21
|
||||
|
||||
/* Basic discovery information about a peer */
|
||||
typedef struct irda_device_info discinfo_t; /* linux/irda.h */
|
||||
|
||||
/*
|
||||
* The DISCOVERY structure is used for both discovery requests and responses
|
||||
*/
|
||||
typedef struct discovery_t {
|
||||
irda_queue_t q; /* Must be first! */
|
||||
|
||||
discinfo_t data; /* Basic discovery information */
|
||||
int name_len; /* Lenght of nickname */
|
||||
|
||||
LAP_REASON condition; /* More info about the discovery */
|
||||
int gen_addr_bit; /* Need to generate a new device
|
||||
* address? */
|
||||
int nslots; /* Number of slots to use when
|
||||
* discovering */
|
||||
unsigned long timestamp; /* Last time discovered */
|
||||
unsigned long firststamp; /* First time discovered */
|
||||
} discovery_t;
|
||||
|
||||
void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *discovery);
|
||||
void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log);
|
||||
void irlmp_expire_discoveries(hashbin_t *log, __u32 saddr, int force);
|
||||
struct irda_device_info *irlmp_copy_discoveries(hashbin_t *log, int *pn,
|
||||
__u16 mask, int old_entries);
|
||||
|
||||
#endif
|
108
include/net/irda/ircomm_core.h
Normal file
108
include/net/irda/ircomm_core.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_core.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Wed Jun 9 08:58:43 1999
|
||||
* Modified at: Mon Dec 13 11:52:29 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_CORE_H
|
||||
#define IRCOMM_CORE_H
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/irqueue.h>
|
||||
#include <net/irda/ircomm_event.h>
|
||||
|
||||
#define IRCOMM_MAGIC 0x98347298
|
||||
#define IRCOMM_HEADER_SIZE 1
|
||||
|
||||
struct ircomm_cb; /* Forward decl. */
|
||||
|
||||
/*
|
||||
* A small call-table, so we don't have to check the service-type whenever
|
||||
* we want to do something
|
||||
*/
|
||||
typedef struct {
|
||||
int (*data_request)(struct ircomm_cb *, struct sk_buff *, int clen);
|
||||
int (*connect_request)(struct ircomm_cb *, struct sk_buff *,
|
||||
struct ircomm_info *);
|
||||
int (*connect_response)(struct ircomm_cb *, struct sk_buff *);
|
||||
int (*disconnect_request)(struct ircomm_cb *, struct sk_buff *,
|
||||
struct ircomm_info *);
|
||||
} call_t;
|
||||
|
||||
struct ircomm_cb {
|
||||
irda_queue_t queue;
|
||||
magic_t magic;
|
||||
|
||||
notify_t notify;
|
||||
call_t issue;
|
||||
|
||||
int state;
|
||||
int line; /* Which TTY line we are using */
|
||||
|
||||
struct tsap_cb *tsap;
|
||||
struct lsap_cb *lsap;
|
||||
|
||||
__u8 dlsap_sel; /* Destination LSAP/TSAP selector */
|
||||
__u8 slsap_sel; /* Source LSAP/TSAP selector */
|
||||
|
||||
__u32 saddr; /* Source device address (link we are using) */
|
||||
__u32 daddr; /* Destination device address */
|
||||
|
||||
int max_header_size; /* Header space we must reserve for each frame */
|
||||
int max_data_size; /* The amount of data we can fill in each frame */
|
||||
|
||||
LOCAL_FLOW flow_status; /* Used by ircomm_lmp */
|
||||
int pkt_count; /* Number of frames we have sent to IrLAP */
|
||||
|
||||
__u8 service_type;
|
||||
};
|
||||
|
||||
extern hashbin_t *ircomm;
|
||||
|
||||
struct ircomm_cb *ircomm_open(notify_t *notify, __u8 service_type, int line);
|
||||
int ircomm_close(struct ircomm_cb *self);
|
||||
|
||||
int ircomm_data_request(struct ircomm_cb *self, struct sk_buff *skb);
|
||||
void ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb);
|
||||
void ircomm_process_data(struct ircomm_cb *self, struct sk_buff *skb);
|
||||
int ircomm_control_request(struct ircomm_cb *self, struct sk_buff *skb);
|
||||
int ircomm_connect_request(struct ircomm_cb *self, __u8 dlsap_sel,
|
||||
__u32 saddr, __u32 daddr, struct sk_buff *skb,
|
||||
__u8 service_type);
|
||||
void ircomm_connect_indication(struct ircomm_cb *self, struct sk_buff *skb,
|
||||
struct ircomm_info *info);
|
||||
void ircomm_connect_confirm(struct ircomm_cb *self, struct sk_buff *skb,
|
||||
struct ircomm_info *info);
|
||||
int ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata);
|
||||
int ircomm_disconnect_request(struct ircomm_cb *self, struct sk_buff *userdata);
|
||||
void ircomm_disconnect_indication(struct ircomm_cb *self, struct sk_buff *skb,
|
||||
struct ircomm_info *info);
|
||||
void ircomm_flow_request(struct ircomm_cb *self, LOCAL_FLOW flow);
|
||||
|
||||
#define ircomm_is_connected(self) (self->state == IRCOMM_CONN)
|
||||
|
||||
#endif
|
85
include/net/irda/ircomm_event.h
Normal file
85
include/net/irda/ircomm_event.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_event.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Jun 6 23:51:13 1999
|
||||
* Modified at: Thu Jun 10 08:36:25 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_EVENT_H
|
||||
#define IRCOMM_EVENT_H
|
||||
|
||||
#include <net/irda/irmod.h>
|
||||
|
||||
typedef enum {
|
||||
IRCOMM_IDLE,
|
||||
IRCOMM_WAITI,
|
||||
IRCOMM_WAITR,
|
||||
IRCOMM_CONN,
|
||||
} IRCOMM_STATE;
|
||||
|
||||
/* IrCOMM Events */
|
||||
typedef enum {
|
||||
IRCOMM_CONNECT_REQUEST,
|
||||
IRCOMM_CONNECT_RESPONSE,
|
||||
IRCOMM_TTP_CONNECT_INDICATION,
|
||||
IRCOMM_LMP_CONNECT_INDICATION,
|
||||
IRCOMM_TTP_CONNECT_CONFIRM,
|
||||
IRCOMM_LMP_CONNECT_CONFIRM,
|
||||
|
||||
IRCOMM_LMP_DISCONNECT_INDICATION,
|
||||
IRCOMM_TTP_DISCONNECT_INDICATION,
|
||||
IRCOMM_DISCONNECT_REQUEST,
|
||||
|
||||
IRCOMM_TTP_DATA_INDICATION,
|
||||
IRCOMM_LMP_DATA_INDICATION,
|
||||
IRCOMM_DATA_REQUEST,
|
||||
IRCOMM_CONTROL_REQUEST,
|
||||
IRCOMM_CONTROL_INDICATION,
|
||||
} IRCOMM_EVENT;
|
||||
|
||||
/*
|
||||
* Used for passing information through the state-machine
|
||||
*/
|
||||
struct ircomm_info {
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
__u8 dlsap_sel;
|
||||
LM_REASON reason; /* Reason for disconnect */
|
||||
__u32 max_data_size;
|
||||
__u32 max_header_size;
|
||||
|
||||
struct qos_info *qos;
|
||||
};
|
||||
|
||||
extern char *ircomm_state[];
|
||||
|
||||
struct ircomm_cb; /* Forward decl. */
|
||||
|
||||
int ircomm_do_event(struct ircomm_cb *self, IRCOMM_EVENT event,
|
||||
struct sk_buff *skb, struct ircomm_info *info);
|
||||
void ircomm_next_state(struct ircomm_cb *self, IRCOMM_STATE state);
|
||||
|
||||
#endif
|
38
include/net/irda/ircomm_lmp.h
Normal file
38
include/net/irda/ircomm_lmp.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_lmp.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Wed Jun 9 10:06:07 1999
|
||||
* Modified at: Fri Aug 13 07:32:32 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_LMP_H
|
||||
#define IRCOMM_LMP_H
|
||||
|
||||
#include <net/irda/ircomm_core.h>
|
||||
|
||||
int ircomm_open_lsap(struct ircomm_cb *self);
|
||||
|
||||
#endif
|
149
include/net/irda/ircomm_param.h
Normal file
149
include/net/irda/ircomm_param.h
Normal file
@@ -0,0 +1,149 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_param.h
|
||||
* Version: 1.0
|
||||
* Description: Parameter handling for the IrCOMM protocol
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Jun 7 08:47:28 1999
|
||||
* Modified at: Wed Aug 25 13:46:33 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_PARAMS_H
|
||||
#define IRCOMM_PARAMS_H
|
||||
|
||||
#include <net/irda/parameters.h>
|
||||
|
||||
/* Parameters common to all service types */
|
||||
#define IRCOMM_SERVICE_TYPE 0x00
|
||||
#define IRCOMM_PORT_TYPE 0x01 /* Only used in LM-IAS */
|
||||
#define IRCOMM_PORT_NAME 0x02 /* Only used in LM-IAS */
|
||||
|
||||
/* Parameters for both 3 wire and 9 wire */
|
||||
#define IRCOMM_DATA_RATE 0x10
|
||||
#define IRCOMM_DATA_FORMAT 0x11
|
||||
#define IRCOMM_FLOW_CONTROL 0x12
|
||||
#define IRCOMM_XON_XOFF 0x13
|
||||
#define IRCOMM_ENQ_ACK 0x14
|
||||
#define IRCOMM_LINE_STATUS 0x15
|
||||
#define IRCOMM_BREAK 0x16
|
||||
|
||||
/* Parameters for 9 wire */
|
||||
#define IRCOMM_DTE 0x20
|
||||
#define IRCOMM_DCE 0x21
|
||||
#define IRCOMM_POLL 0x22
|
||||
|
||||
/* Service type (details) */
|
||||
#define IRCOMM_3_WIRE_RAW 0x01
|
||||
#define IRCOMM_3_WIRE 0x02
|
||||
#define IRCOMM_9_WIRE 0x04
|
||||
#define IRCOMM_CENTRONICS 0x08
|
||||
|
||||
/* Port type (details) */
|
||||
#define IRCOMM_SERIAL 0x00
|
||||
#define IRCOMM_PARALLEL 0x01
|
||||
|
||||
/* Data format (details) */
|
||||
#define IRCOMM_WSIZE_5 0x00
|
||||
#define IRCOMM_WSIZE_6 0x01
|
||||
#define IRCOMM_WSIZE_7 0x02
|
||||
#define IRCOMM_WSIZE_8 0x03
|
||||
|
||||
#define IRCOMM_1_STOP_BIT 0x00
|
||||
#define IRCOMM_2_STOP_BIT 0x04 /* 1.5 if char len 5 */
|
||||
|
||||
#define IRCOMM_PARITY_DISABLE 0x00
|
||||
#define IRCOMM_PARITY_ENABLE 0x08
|
||||
|
||||
#define IRCOMM_PARITY_ODD 0x00
|
||||
#define IRCOMM_PARITY_EVEN 0x10
|
||||
#define IRCOMM_PARITY_MARK 0x20
|
||||
#define IRCOMM_PARITY_SPACE 0x30
|
||||
|
||||
/* Flow control */
|
||||
#define IRCOMM_XON_XOFF_IN 0x01
|
||||
#define IRCOMM_XON_XOFF_OUT 0x02
|
||||
#define IRCOMM_RTS_CTS_IN 0x04
|
||||
#define IRCOMM_RTS_CTS_OUT 0x08
|
||||
#define IRCOMM_DSR_DTR_IN 0x10
|
||||
#define IRCOMM_DSR_DTR_OUT 0x20
|
||||
#define IRCOMM_ENQ_ACK_IN 0x40
|
||||
#define IRCOMM_ENQ_ACK_OUT 0x80
|
||||
|
||||
/* Line status */
|
||||
#define IRCOMM_OVERRUN_ERROR 0x02
|
||||
#define IRCOMM_PARITY_ERROR 0x04
|
||||
#define IRCOMM_FRAMING_ERROR 0x08
|
||||
|
||||
/* DTE (Data terminal equipment) line settings */
|
||||
#define IRCOMM_DELTA_DTR 0x01
|
||||
#define IRCOMM_DELTA_RTS 0x02
|
||||
#define IRCOMM_DTR 0x04
|
||||
#define IRCOMM_RTS 0x08
|
||||
|
||||
/* DCE (Data communications equipment) line settings */
|
||||
#define IRCOMM_DELTA_CTS 0x01 /* Clear to send has changed */
|
||||
#define IRCOMM_DELTA_DSR 0x02 /* Data set ready has changed */
|
||||
#define IRCOMM_DELTA_RI 0x04 /* Ring indicator has changed */
|
||||
#define IRCOMM_DELTA_CD 0x08 /* Carrier detect has changed */
|
||||
#define IRCOMM_CTS 0x10 /* Clear to send is high */
|
||||
#define IRCOMM_DSR 0x20 /* Data set ready is high */
|
||||
#define IRCOMM_RI 0x40 /* Ring indicator is high */
|
||||
#define IRCOMM_CD 0x80 /* Carrier detect is high */
|
||||
#define IRCOMM_DCE_DELTA_ANY 0x0f
|
||||
|
||||
/*
|
||||
* Parameter state
|
||||
*/
|
||||
struct ircomm_params {
|
||||
/* General control params */
|
||||
__u8 service_type;
|
||||
__u8 port_type;
|
||||
char port_name[32];
|
||||
|
||||
/* Control params for 3- and 9-wire service type */
|
||||
__u32 data_rate; /* Data rate in bps */
|
||||
__u8 data_format;
|
||||
__u8 flow_control;
|
||||
char xonxoff[2];
|
||||
char enqack[2];
|
||||
__u8 line_status;
|
||||
__u8 _break;
|
||||
|
||||
__u8 null_modem;
|
||||
|
||||
/* Control params for 9-wire service type */
|
||||
__u8 dte;
|
||||
__u8 dce;
|
||||
__u8 poll;
|
||||
|
||||
/* Control params for Centronics service type */
|
||||
};
|
||||
|
||||
struct ircomm_tty_cb; /* Forward decl. */
|
||||
|
||||
int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush);
|
||||
|
||||
extern pi_param_info_t ircomm_param_info;
|
||||
|
||||
#endif /* IRCOMM_PARAMS_H */
|
||||
|
39
include/net/irda/ircomm_ttp.h
Normal file
39
include/net/irda/ircomm_ttp.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_ttp.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Wed Jun 9 10:06:07 1999
|
||||
* Modified at: Fri Aug 13 07:32:22 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_TTP_H
|
||||
#define IRCOMM_TTP_H
|
||||
|
||||
#include <net/irda/ircomm_core.h>
|
||||
|
||||
int ircomm_open_tsap(struct ircomm_cb *self);
|
||||
|
||||
#endif
|
||||
|
139
include/net/irda/ircomm_tty.h
Normal file
139
include/net/irda/ircomm_tty.h
Normal file
@@ -0,0 +1,139 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_tty.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Jun 6 23:24:22 1999
|
||||
* Modified at: Fri Jan 28 13:16:57 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_TTY_H
|
||||
#define IRCOMM_TTY_H
|
||||
|
||||
#include <linux/serial.h>
|
||||
#include <linux/termios.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/tty.h> /* struct tty_struct */
|
||||
|
||||
#include <net/irda/irias_object.h>
|
||||
#include <net/irda/ircomm_core.h>
|
||||
#include <net/irda/ircomm_param.h>
|
||||
|
||||
#define IRCOMM_TTY_PORTS 32
|
||||
#define IRCOMM_TTY_MAGIC 0x3432
|
||||
#define IRCOMM_TTY_MAJOR 161
|
||||
#define IRCOMM_TTY_MINOR 0
|
||||
|
||||
/* This is used as an initial value to max_header_size before the proper
|
||||
* value is filled in (5 for ttp, 4 for lmp). This allow us to detect
|
||||
* the state of the underlying connection. - Jean II */
|
||||
#define IRCOMM_TTY_HDR_UNINITIALISED 16
|
||||
/* Same for payload size. See qos.c for the smallest max data size */
|
||||
#define IRCOMM_TTY_DATA_UNINITIALISED (64 - IRCOMM_TTY_HDR_UNINITIALISED)
|
||||
|
||||
/* Those are really defined in include/linux/serial.h - Jean II */
|
||||
#define ASYNC_B_INITIALIZED 31 /* Serial port was initialized */
|
||||
#define ASYNC_B_NORMAL_ACTIVE 29 /* Normal device is active */
|
||||
#define ASYNC_B_CLOSING 27 /* Serial port is closing */
|
||||
|
||||
/*
|
||||
* IrCOMM TTY driver state
|
||||
*/
|
||||
struct ircomm_tty_cb {
|
||||
irda_queue_t queue; /* Must be first */
|
||||
magic_t magic;
|
||||
|
||||
int state; /* Connect state */
|
||||
|
||||
struct tty_struct *tty;
|
||||
struct ircomm_cb *ircomm; /* IrCOMM layer instance */
|
||||
|
||||
struct sk_buff *tx_skb; /* Transmit buffer */
|
||||
struct sk_buff *ctrl_skb; /* Control data buffer */
|
||||
|
||||
/* Parameters */
|
||||
struct ircomm_params settings;
|
||||
|
||||
__u8 service_type; /* The service that we support */
|
||||
int client; /* True if we are a client */
|
||||
LOCAL_FLOW flow; /* IrTTP flow status */
|
||||
|
||||
int line;
|
||||
unsigned long flags;
|
||||
|
||||
__u8 dlsap_sel;
|
||||
__u8 slsap_sel;
|
||||
|
||||
__u32 saddr;
|
||||
__u32 daddr;
|
||||
|
||||
__u32 max_data_size; /* Max data we can transmit in one packet */
|
||||
__u32 max_header_size; /* The amount of header space we must reserve */
|
||||
__u32 tx_data_size; /* Max data size of current tx_skb */
|
||||
|
||||
struct iriap_cb *iriap; /* Instance used for querying remote IAS */
|
||||
struct ias_object* obj;
|
||||
void *skey;
|
||||
void *ckey;
|
||||
|
||||
wait_queue_head_t open_wait;
|
||||
wait_queue_head_t close_wait;
|
||||
struct timer_list watchdog_timer;
|
||||
struct work_struct tqueue;
|
||||
|
||||
unsigned short close_delay;
|
||||
unsigned short closing_wait; /* time to wait before closing */
|
||||
|
||||
int open_count;
|
||||
int blocked_open; /* # of blocked opens */
|
||||
|
||||
/* Protect concurent access to :
|
||||
* o self->open_count
|
||||
* o self->ctrl_skb
|
||||
* o self->tx_skb
|
||||
* Maybe other things may gain to be protected as well...
|
||||
* Jean II */
|
||||
spinlock_t spinlock;
|
||||
};
|
||||
|
||||
void ircomm_tty_start(struct tty_struct *tty);
|
||||
void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self);
|
||||
|
||||
extern int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file);
|
||||
extern int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file,
|
||||
unsigned int set, unsigned int clear);
|
||||
extern int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern void ircomm_tty_set_termios(struct tty_struct *tty,
|
||||
struct termios *old_termios);
|
||||
extern hashbin_t *ircomm_tty;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
94
include/net/irda/ircomm_tty_attach.h
Normal file
94
include/net/irda/ircomm_tty_attach.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: ircomm_tty_attach.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Wed Jun 9 15:55:18 1999
|
||||
* Modified at: Fri Dec 10 21:04:55 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRCOMM_TTY_ATTACH_H
|
||||
#define IRCOMM_TTY_ATTACH_H
|
||||
|
||||
#include <net/irda/ircomm_tty.h>
|
||||
|
||||
typedef enum {
|
||||
IRCOMM_TTY_IDLE,
|
||||
IRCOMM_TTY_SEARCH,
|
||||
IRCOMM_TTY_QUERY_PARAMETERS,
|
||||
IRCOMM_TTY_QUERY_LSAP_SEL,
|
||||
IRCOMM_TTY_SETUP,
|
||||
IRCOMM_TTY_READY,
|
||||
} IRCOMM_TTY_STATE;
|
||||
|
||||
/* IrCOMM TTY Events */
|
||||
typedef enum {
|
||||
IRCOMM_TTY_ATTACH_CABLE,
|
||||
IRCOMM_TTY_DETACH_CABLE,
|
||||
IRCOMM_TTY_DATA_REQUEST,
|
||||
IRCOMM_TTY_DATA_INDICATION,
|
||||
IRCOMM_TTY_DISCOVERY_REQUEST,
|
||||
IRCOMM_TTY_DISCOVERY_INDICATION,
|
||||
IRCOMM_TTY_CONNECT_CONFIRM,
|
||||
IRCOMM_TTY_CONNECT_INDICATION,
|
||||
IRCOMM_TTY_DISCONNECT_REQUEST,
|
||||
IRCOMM_TTY_DISCONNECT_INDICATION,
|
||||
IRCOMM_TTY_WD_TIMER_EXPIRED,
|
||||
IRCOMM_TTY_GOT_PARAMETERS,
|
||||
IRCOMM_TTY_GOT_LSAPSEL,
|
||||
} IRCOMM_TTY_EVENT;
|
||||
|
||||
/* Used for passing information through the state-machine */
|
||||
struct ircomm_tty_info {
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
__u8 dlsap_sel;
|
||||
};
|
||||
|
||||
extern char *ircomm_state[];
|
||||
extern char *ircomm_tty_state[];
|
||||
|
||||
int ircomm_tty_do_event(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
|
||||
struct sk_buff *skb, struct ircomm_tty_info *info);
|
||||
|
||||
|
||||
int ircomm_tty_attach_cable(struct ircomm_tty_cb *self);
|
||||
void ircomm_tty_detach_cable(struct ircomm_tty_cb *self);
|
||||
void ircomm_tty_connect_confirm(void *instance, void *sap,
|
||||
struct qos_info *qos,
|
||||
__u32 max_sdu_size,
|
||||
__u8 max_header_size,
|
||||
struct sk_buff *skb);
|
||||
void ircomm_tty_disconnect_indication(void *instance, void *sap,
|
||||
LM_REASON reason,
|
||||
struct sk_buff *skb);
|
||||
void ircomm_tty_connect_indication(void *instance, void *sap,
|
||||
struct qos_info *qos,
|
||||
__u32 max_sdu_size,
|
||||
__u8 max_header_size,
|
||||
struct sk_buff *skb);
|
||||
int ircomm_tty_send_initial_parameters(struct ircomm_tty_cb *self);
|
||||
void ircomm_tty_link_established(struct ircomm_tty_cb *self);
|
||||
|
||||
#endif /* IRCOMM_TTY_ATTACH_H */
|
117
include/net/irda/irda.h
Normal file
117
include/net/irda/irda.h
Normal file
@@ -0,0 +1,117 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irda.h
|
||||
* Version: 1.0
|
||||
* Description: IrDA common include file for kernel internal use
|
||||
* Status: Stable
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Dec 9 21:13:12 1997
|
||||
* Modified at: Fri Jan 28 13:16:32 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef NET_IRDA_H
|
||||
#define NET_IRDA_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/skbuff.h> /* struct sk_buff */
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/if.h> /* sa_family_t in <linux/irda.h> */
|
||||
#include <linux/irda.h>
|
||||
|
||||
typedef __u32 magic_t;
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
/* Hack to do small backoff when setting media busy in IrLAP */
|
||||
#ifndef SMALL
|
||||
#define SMALL 5
|
||||
#endif
|
||||
|
||||
#ifndef IRDA_MIN /* Lets not mix this MIN with other header files */
|
||||
#define IRDA_MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef IRDA_ALIGN
|
||||
# define IRDA_ALIGN __attribute__((aligned))
|
||||
#endif
|
||||
#ifndef IRDA_PACK
|
||||
# define IRDA_PACK __attribute__((packed))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_IRDA_DEBUG
|
||||
|
||||
extern unsigned int irda_debug;
|
||||
|
||||
/* use 0 for production, 1 for verification, >2 for debug */
|
||||
#define IRDA_DEBUG_LEVEL 0
|
||||
|
||||
#define IRDA_DEBUG(n, args...) \
|
||||
do { if (irda_debug >= (n)) \
|
||||
printk(KERN_DEBUG args); \
|
||||
} while (0)
|
||||
#define IRDA_ASSERT(expr, func) \
|
||||
do { if(!(expr)) { \
|
||||
printk( "Assertion failed! %s:%s:%d %s\n", \
|
||||
__FILE__,__FUNCTION__,__LINE__,(#expr) ); \
|
||||
func } } while (0)
|
||||
#define IRDA_ASSERT_LABEL(label) label
|
||||
#else
|
||||
#define IRDA_DEBUG(n, args...) do { } while (0)
|
||||
#define IRDA_ASSERT(expr, func) do { (void)(expr); } while (0)
|
||||
#define IRDA_ASSERT_LABEL(label)
|
||||
#endif /* CONFIG_IRDA_DEBUG */
|
||||
|
||||
#define IRDA_WARNING(args...) printk(KERN_WARNING args)
|
||||
#define IRDA_MESSAGE(args...) printk(KERN_INFO args)
|
||||
#define IRDA_ERROR(args...) printk(KERN_ERR args)
|
||||
|
||||
/*
|
||||
* Magic numbers used by Linux-IrDA. Random numbers which must be unique to
|
||||
* give the best protection
|
||||
*/
|
||||
|
||||
#define IRTTY_MAGIC 0x2357
|
||||
#define LAP_MAGIC 0x1357
|
||||
#define LMP_MAGIC 0x4321
|
||||
#define LMP_LSAP_MAGIC 0x69333
|
||||
#define LMP_LAP_MAGIC 0x3432
|
||||
#define IRDA_DEVICE_MAGIC 0x63454
|
||||
#define IAS_MAGIC 0x007
|
||||
#define TTP_MAGIC 0x241169
|
||||
#define TTP_TSAP_MAGIC 0x4345
|
||||
#define IROBEX_MAGIC 0x341324
|
||||
#define HB_MAGIC 0x64534
|
||||
#define IRLAN_MAGIC 0x754
|
||||
#define IAS_OBJECT_MAGIC 0x34234
|
||||
#define IAS_ATTRIB_MAGIC 0x45232
|
||||
#define IRDA_TASK_MAGIC 0x38423
|
||||
|
||||
#define IAS_DEVICE_ID 0x0000 /* Defined by IrDA, IrLMP section 4.1 (page 68) */
|
||||
#define IAS_PNP_ID 0xd342
|
||||
#define IAS_OBEX_ID 0x34323
|
||||
#define IAS_IRLAN_ID 0x34234
|
||||
#define IAS_IRCOMM_ID 0x2343
|
||||
#define IAS_IRLPT_ID 0x9876
|
||||
|
||||
#endif /* NET_IRDA_H */
|
301
include/net/irda/irda_device.h
Normal file
301
include/net/irda/irda_device.h
Normal file
@@ -0,0 +1,301 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irda_device.h
|
||||
* Version: 0.9
|
||||
* Description: Contains various declarations used by the drivers
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Apr 14 12:41:42 1998
|
||||
* Modified at: Mon Mar 20 09:08:57 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
|
||||
* Copyright (c) 1998 Thomas Davis, <ratbert@radiks.net>,
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
/*
|
||||
* This header contains all the IrDA definitions a driver really
|
||||
* needs, and therefore the driver should not need to include
|
||||
* any other IrDA headers - Jean II
|
||||
*/
|
||||
|
||||
#ifndef IRDA_DEVICE_H
|
||||
#define IRDA_DEVICE_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/skbuff.h> /* struct sk_buff */
|
||||
#include <linux/irda.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/pkt_sched.h>
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/qos.h> /* struct qos_info */
|
||||
#include <net/irda/irqueue.h> /* irda_queue_t */
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct irlap_cb;
|
||||
|
||||
/* Some non-standard interface flags (should not conflict with any in if.h) */
|
||||
#define IFF_SIR 0x0001 /* Supports SIR speeds */
|
||||
#define IFF_MIR 0x0002 /* Supports MIR speeds */
|
||||
#define IFF_FIR 0x0004 /* Supports FIR speeds */
|
||||
#define IFF_VFIR 0x0008 /* Supports VFIR speeds */
|
||||
#define IFF_PIO 0x0010 /* Supports PIO transfer of data */
|
||||
#define IFF_DMA 0x0020 /* Supports DMA transfer of data */
|
||||
#define IFF_SHM 0x0040 /* Supports shared memory data transfers */
|
||||
#define IFF_DONGLE 0x0080 /* Interface has a dongle attached */
|
||||
#define IFF_AIR 0x0100 /* Supports Advanced IR (AIR) standards */
|
||||
|
||||
#define IO_XMIT 0x01
|
||||
#define IO_RECV 0x02
|
||||
|
||||
typedef enum {
|
||||
IRDA_IRLAP, /* IrDA mode, and deliver to IrLAP */
|
||||
IRDA_RAW, /* IrDA mode */
|
||||
SHARP_ASK,
|
||||
TV_REMOTE, /* Also known as Consumer Electronics IR */
|
||||
} INFRARED_MODE;
|
||||
|
||||
typedef enum {
|
||||
IRDA_TASK_INIT, /* All tasks are initialized with this state */
|
||||
IRDA_TASK_DONE, /* Signals that the task is finished */
|
||||
IRDA_TASK_WAIT,
|
||||
IRDA_TASK_WAIT1,
|
||||
IRDA_TASK_WAIT2,
|
||||
IRDA_TASK_WAIT3,
|
||||
IRDA_TASK_CHILD_INIT, /* Initializing child task */
|
||||
IRDA_TASK_CHILD_WAIT, /* Waiting for child task to finish */
|
||||
IRDA_TASK_CHILD_DONE /* Child task is finished */
|
||||
} IRDA_TASK_STATE;
|
||||
|
||||
struct irda_task;
|
||||
typedef int (*IRDA_TASK_CALLBACK) (struct irda_task *task);
|
||||
|
||||
struct irda_task {
|
||||
irda_queue_t q;
|
||||
magic_t magic;
|
||||
|
||||
IRDA_TASK_STATE state;
|
||||
IRDA_TASK_CALLBACK function;
|
||||
IRDA_TASK_CALLBACK finished;
|
||||
|
||||
struct irda_task *parent;
|
||||
struct timer_list timer;
|
||||
|
||||
void *instance; /* Instance being called */
|
||||
void *param; /* Parameter to be used by instance */
|
||||
};
|
||||
|
||||
/* Dongle info */
|
||||
struct dongle_reg;
|
||||
typedef struct {
|
||||
struct dongle_reg *issue; /* Registration info */
|
||||
struct net_device *dev; /* Device we are attached to */
|
||||
struct irda_task *speed_task; /* Task handling speed change */
|
||||
struct irda_task *reset_task; /* Task handling reset */
|
||||
__u32 speed; /* Current speed */
|
||||
|
||||
/* Callbacks to the IrDA device driver */
|
||||
int (*set_mode)(struct net_device *, int mode);
|
||||
int (*read)(struct net_device *dev, __u8 *buf, int len);
|
||||
int (*write)(struct net_device *dev, __u8 *buf, int len);
|
||||
int (*set_dtr_rts)(struct net_device *dev, int dtr, int rts);
|
||||
} dongle_t;
|
||||
|
||||
/* Dongle registration info */
|
||||
struct dongle_reg {
|
||||
irda_queue_t q; /* Must be first */
|
||||
IRDA_DONGLE type;
|
||||
|
||||
void (*open)(dongle_t *dongle, struct qos_info *qos);
|
||||
void (*close)(dongle_t *dongle);
|
||||
int (*reset)(struct irda_task *task);
|
||||
int (*change_speed)(struct irda_task *task);
|
||||
struct module *owner;
|
||||
};
|
||||
|
||||
/*
|
||||
* Per-packet information we need to hide inside sk_buff
|
||||
* (must not exceed 48 bytes, check with struct sk_buff)
|
||||
*/
|
||||
struct irda_skb_cb {
|
||||
magic_t magic; /* Be sure that we can trust the information */
|
||||
__u32 next_speed; /* The Speed to be set *after* this frame */
|
||||
__u16 mtt; /* Minimum turn around time */
|
||||
__u16 xbofs; /* Number of xbofs required, used by SIR mode */
|
||||
__u16 next_xbofs; /* Number of xbofs required *after* this frame */
|
||||
void *context; /* May be used by drivers */
|
||||
void (*destructor)(struct sk_buff *skb); /* Used for flow control */
|
||||
__u16 xbofs_delay; /* Number of xbofs used for generating the mtt */
|
||||
__u8 line; /* Used by IrCOMM in IrLPT mode */
|
||||
};
|
||||
|
||||
/* Chip specific info */
|
||||
typedef struct {
|
||||
int cfg_base; /* Config register IO base */
|
||||
int sir_base; /* SIR IO base */
|
||||
int fir_base; /* FIR IO base */
|
||||
int mem_base; /* Shared memory base */
|
||||
int sir_ext; /* Length of SIR iobase */
|
||||
int fir_ext; /* Length of FIR iobase */
|
||||
int irq, irq2; /* Interrupts used */
|
||||
int dma, dma2; /* DMA channel(s) used */
|
||||
int fifo_size; /* FIFO size */
|
||||
int irqflags; /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */
|
||||
int direction; /* Link direction, used by some FIR drivers */
|
||||
int enabled; /* Powered on? */
|
||||
int suspended; /* Suspended by APM */
|
||||
__u32 speed; /* Currently used speed */
|
||||
__u32 new_speed; /* Speed we must change to when Tx is finished */
|
||||
int dongle_id; /* Dongle or transceiver currently used */
|
||||
} chipio_t;
|
||||
|
||||
/* IO buffer specific info (inspired by struct sk_buff) */
|
||||
typedef struct {
|
||||
int state; /* Receiving state (transmit state not used) */
|
||||
int in_frame; /* True if receiving frame */
|
||||
|
||||
__u8 *head; /* start of buffer */
|
||||
__u8 *data; /* start of data in buffer */
|
||||
|
||||
int len; /* current length of data */
|
||||
int truesize; /* total allocated size of buffer */
|
||||
__u16 fcs;
|
||||
|
||||
struct sk_buff *skb; /* ZeroCopy Rx in async_unwrap_char() */
|
||||
} iobuff_t;
|
||||
|
||||
/* Maximum SIR frame (skb) that we expect to receive *unwrapped*.
|
||||
* Max LAP MTU (I field) is 2048 bytes max (IrLAP 1.1, chapt 6.6.5, p40).
|
||||
* Max LAP header is 2 bytes (for now).
|
||||
* Max CRC is 2 bytes at SIR, 4 bytes at FIR.
|
||||
* Need 1 byte for skb_reserve() to align IP header for IrLAN.
|
||||
* Add a few extra bytes just to be safe (buffer is power of two anyway)
|
||||
* Jean II */
|
||||
#define IRDA_SKB_MAX_MTU 2064
|
||||
/* Maximum SIR frame that we expect to send, wrapped (i.e. with XBOFS
|
||||
* and escaped characters on top of above). */
|
||||
#define IRDA_SIR_MAX_FRAME 4269
|
||||
|
||||
/* The SIR unwrapper async_unwrap_char() will use a Rx-copy-break mechanism
|
||||
* when using the optional ZeroCopy Rx, where only small frames are memcpy
|
||||
* to a smaller skb to save memory. This is the threshold under which copy
|
||||
* will happen (and over which it won't happen).
|
||||
* Some FIR drivers may use this #define as well...
|
||||
* This is the same value as various Ethernet drivers. - Jean II */
|
||||
#define IRDA_RX_COPY_THRESHOLD 256
|
||||
|
||||
/* Function prototypes */
|
||||
int irda_device_init(void);
|
||||
void irda_device_cleanup(void);
|
||||
|
||||
/* IrLAP entry points used by the drivers.
|
||||
* We declare them here to avoid the driver pulling a whole bunch stack
|
||||
* headers they don't really need - Jean II */
|
||||
struct irlap_cb *irlap_open(struct net_device *dev, struct qos_info *qos,
|
||||
const char *hw_name);
|
||||
void irlap_close(struct irlap_cb *self);
|
||||
|
||||
/* Interface to be uses by IrLAP */
|
||||
void irda_device_set_media_busy(struct net_device *dev, int status);
|
||||
int irda_device_is_media_busy(struct net_device *dev);
|
||||
int irda_device_is_receiving(struct net_device *dev);
|
||||
|
||||
/* Interface for internal use */
|
||||
static inline int irda_device_txqueue_empty(const struct net_device *dev)
|
||||
{
|
||||
return (skb_queue_len(&dev->qdisc->q) == 0);
|
||||
}
|
||||
int irda_device_set_raw_mode(struct net_device* self, int status);
|
||||
struct net_device *alloc_irdadev(int sizeof_priv);
|
||||
|
||||
/* Dongle interface */
|
||||
void irda_device_unregister_dongle(struct dongle_reg *dongle);
|
||||
int irda_device_register_dongle(struct dongle_reg *dongle);
|
||||
dongle_t *irda_device_dongle_init(struct net_device *dev, int type);
|
||||
int irda_device_dongle_cleanup(dongle_t *dongle);
|
||||
|
||||
#ifdef CONFIG_ISA
|
||||
void irda_setup_dma(int channel, dma_addr_t buffer, int count, int mode);
|
||||
#endif
|
||||
|
||||
void irda_task_delete(struct irda_task *task);
|
||||
struct irda_task *irda_task_execute(void *instance,
|
||||
IRDA_TASK_CALLBACK function,
|
||||
IRDA_TASK_CALLBACK finished,
|
||||
struct irda_task *parent, void *param);
|
||||
void irda_task_next_state(struct irda_task *task, IRDA_TASK_STATE state);
|
||||
|
||||
/*
|
||||
* Function irda_get_mtt (skb)
|
||||
*
|
||||
* Utility function for getting the minimum turnaround time out of
|
||||
* the skb, where it has been hidden in the cb field.
|
||||
*/
|
||||
static inline __u16 irda_get_mtt(const struct sk_buff *skb)
|
||||
{
|
||||
const struct irda_skb_cb *cb = (const struct irda_skb_cb *) skb->cb;
|
||||
return (cb->magic == LAP_MAGIC) ? cb->mtt : 10000;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function irda_get_next_speed (skb)
|
||||
*
|
||||
* Extract the speed that should be set *after* this frame from the skb
|
||||
*
|
||||
* Note : return -1 for user space frames
|
||||
*/
|
||||
static inline __u32 irda_get_next_speed(const struct sk_buff *skb)
|
||||
{
|
||||
const struct irda_skb_cb *cb = (const struct irda_skb_cb *) skb->cb;
|
||||
return (cb->magic == LAP_MAGIC) ? cb->next_speed : -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function irda_get_next_xbofs (skb)
|
||||
*
|
||||
* Extract the xbofs that should be set for this frame from the skb
|
||||
*
|
||||
* Note : default to 10 for user space frames
|
||||
*/
|
||||
static inline __u16 irda_get_xbofs(const struct sk_buff *skb)
|
||||
{
|
||||
const struct irda_skb_cb *cb = (const struct irda_skb_cb *) skb->cb;
|
||||
return (cb->magic == LAP_MAGIC) ? cb->xbofs : 10;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function irda_get_next_xbofs (skb)
|
||||
*
|
||||
* Extract the xbofs that should be set *after* this frame from the skb
|
||||
*
|
||||
* Note : return -1 for user space frames
|
||||
*/
|
||||
static inline __u16 irda_get_next_xbofs(const struct sk_buff *skb)
|
||||
{
|
||||
const struct irda_skb_cb *cb = (const struct irda_skb_cb *) skb->cb;
|
||||
return (cb->magic == LAP_MAGIC) ? cb->next_xbofs : -1;
|
||||
}
|
||||
#endif /* IRDA_DEVICE_H */
|
||||
|
||||
|
108
include/net/irda/iriap.h
Normal file
108
include/net/irda/iriap.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: iriap.h
|
||||
* Version: 0.5
|
||||
* Description: Information Access Protocol (IAP)
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Thu Aug 21 00:02:07 1997
|
||||
* Modified at: Sat Dec 25 16:42:09 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRIAP_H
|
||||
#define IRIAP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/irda/iriap_event.h>
|
||||
#include <net/irda/irias_object.h>
|
||||
#include <net/irda/irqueue.h> /* irda_queue_t */
|
||||
#include <net/irda/timer.h> /* struct timer_list */
|
||||
|
||||
#define IAP_LST 0x80
|
||||
#define IAP_ACK 0x40
|
||||
|
||||
#define IAS_SERVER 0
|
||||
#define IAS_CLIENT 1
|
||||
|
||||
/* IrIAP Op-codes */
|
||||
#define GET_INFO_BASE 0x01
|
||||
#define GET_OBJECTS 0x02
|
||||
#define GET_VALUE 0x03
|
||||
#define GET_VALUE_BY_CLASS 0x04
|
||||
#define GET_OBJECT_INFO 0x05
|
||||
#define GET_ATTRIB_NAMES 0x06
|
||||
|
||||
#define IAS_SUCCESS 0
|
||||
#define IAS_CLASS_UNKNOWN 1
|
||||
#define IAS_ATTRIB_UNKNOWN 2
|
||||
#define IAS_DISCONNECT 10
|
||||
|
||||
typedef void (*CONFIRM_CALLBACK)(int result, __u16 obj_id,
|
||||
struct ias_value *value, void *priv);
|
||||
|
||||
struct iriap_cb {
|
||||
irda_queue_t q; /* Must be first */
|
||||
magic_t magic; /* Magic cookie */
|
||||
|
||||
int mode; /* Client or server */
|
||||
|
||||
__u32 saddr;
|
||||
__u32 daddr;
|
||||
__u8 operation;
|
||||
|
||||
struct sk_buff *request_skb;
|
||||
struct lsap_cb *lsap;
|
||||
__u8 slsap_sel;
|
||||
|
||||
/* Client states */
|
||||
IRIAP_STATE client_state;
|
||||
IRIAP_STATE call_state;
|
||||
|
||||
/* Server states */
|
||||
IRIAP_STATE server_state;
|
||||
IRIAP_STATE r_connect_state;
|
||||
|
||||
CONFIRM_CALLBACK confirm;
|
||||
void *priv; /* Used to identify client */
|
||||
|
||||
__u8 max_header_size;
|
||||
__u32 max_data_size;
|
||||
|
||||
struct timer_list watchdog_timer;
|
||||
};
|
||||
|
||||
int iriap_init(void);
|
||||
void iriap_cleanup(void);
|
||||
|
||||
struct iriap_cb *iriap_open(__u8 slsap_sel, int mode, void *priv,
|
||||
CONFIRM_CALLBACK callback);
|
||||
void iriap_close(struct iriap_cb *self);
|
||||
|
||||
int iriap_getvaluebyclass_request(struct iriap_cb *self,
|
||||
__u32 saddr, __u32 daddr,
|
||||
char *name, char *attr);
|
||||
void iriap_connect_request(struct iriap_cb *self);
|
||||
void iriap_send_ack( struct iriap_cb *self);
|
||||
void iriap_call_indication(struct iriap_cb *self, struct sk_buff *skb);
|
||||
|
||||
void iriap_register_server(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
85
include/net/irda/iriap_event.h
Normal file
85
include/net/irda/iriap_event.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: iriap_event.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Aug 4 20:40:53 1997
|
||||
* Modified at: Sun Oct 31 22:02:54 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRIAP_FSM_H
|
||||
#define IRIAP_FSM_H
|
||||
|
||||
/* Forward because of circular include dependecies */
|
||||
struct iriap_cb;
|
||||
|
||||
/* IrIAP states */
|
||||
typedef enum {
|
||||
/* Client */
|
||||
S_DISCONNECT,
|
||||
S_CONNECTING,
|
||||
S_CALL,
|
||||
|
||||
/* S-Call */
|
||||
S_MAKE_CALL,
|
||||
S_CALLING,
|
||||
S_OUTSTANDING,
|
||||
S_REPLYING,
|
||||
S_WAIT_FOR_CALL,
|
||||
S_WAIT_ACTIVE,
|
||||
|
||||
/* Server */
|
||||
R_DISCONNECT,
|
||||
R_CALL,
|
||||
|
||||
/* R-Connect */
|
||||
R_WAITING,
|
||||
R_WAIT_ACTIVE,
|
||||
R_RECEIVING,
|
||||
R_EXECUTE,
|
||||
R_RETURNING,
|
||||
} IRIAP_STATE;
|
||||
|
||||
typedef enum {
|
||||
IAP_CALL_REQUEST,
|
||||
IAP_CALL_REQUEST_GVBC,
|
||||
IAP_CALL_RESPONSE,
|
||||
IAP_RECV_F_LST,
|
||||
IAP_LM_DISCONNECT_INDICATION,
|
||||
IAP_LM_CONNECT_INDICATION,
|
||||
IAP_LM_CONNECT_CONFIRM,
|
||||
} IRIAP_EVENT;
|
||||
|
||||
void iriap_next_client_state (struct iriap_cb *self, IRIAP_STATE state);
|
||||
void iriap_next_call_state (struct iriap_cb *self, IRIAP_STATE state);
|
||||
void iriap_next_server_state (struct iriap_cb *self, IRIAP_STATE state);
|
||||
void iriap_next_r_connect_state(struct iriap_cb *self, IRIAP_STATE state);
|
||||
|
||||
|
||||
void iriap_do_client_event(struct iriap_cb *self, IRIAP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
void iriap_do_call_event (struct iriap_cb *self, IRIAP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void iriap_do_server_event (struct iriap_cb *self, IRIAP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
void iriap_do_r_connect_event(struct iriap_cb *self, IRIAP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#endif /* IRIAP_FSM_H */
|
||||
|
108
include/net/irda/irias_object.h
Normal file
108
include/net/irda/irias_object.h
Normal file
@@ -0,0 +1,108 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irias_object.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Thu Oct 1 22:49:50 1998
|
||||
* Modified at: Wed Dec 15 11:20:57 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef LM_IAS_OBJECT_H
|
||||
#define LM_IAS_OBJECT_H
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/irqueue.h>
|
||||
|
||||
/* LM-IAS Attribute types */
|
||||
#define IAS_MISSING 0
|
||||
#define IAS_INTEGER 1
|
||||
#define IAS_OCT_SEQ 2
|
||||
#define IAS_STRING 3
|
||||
|
||||
/* Object ownership of attributes (user or kernel) */
|
||||
#define IAS_KERNEL_ATTR 0
|
||||
#define IAS_USER_ATTR 1
|
||||
|
||||
/*
|
||||
* LM-IAS Object
|
||||
*/
|
||||
struct ias_object {
|
||||
irda_queue_t q; /* Must be first! */
|
||||
magic_t magic;
|
||||
|
||||
char *name;
|
||||
int id;
|
||||
hashbin_t *attribs;
|
||||
};
|
||||
|
||||
/*
|
||||
* Values used by LM-IAS attributes
|
||||
*/
|
||||
struct ias_value {
|
||||
__u8 type; /* Value description */
|
||||
__u8 owner; /* Managed from user/kernel space */
|
||||
int charset; /* Only used by string type */
|
||||
int len;
|
||||
|
||||
/* Value */
|
||||
union {
|
||||
int integer;
|
||||
char *string;
|
||||
__u8 *oct_seq;
|
||||
} t;
|
||||
};
|
||||
|
||||
/*
|
||||
* Attributes used by LM-IAS objects
|
||||
*/
|
||||
struct ias_attrib {
|
||||
irda_queue_t q; /* Must be first! */
|
||||
int magic;
|
||||
|
||||
char *name; /* Attribute name */
|
||||
struct ias_value *value; /* Attribute value */
|
||||
};
|
||||
|
||||
struct ias_object *irias_new_object(char *name, int id);
|
||||
void irias_insert_object(struct ias_object *obj);
|
||||
int irias_delete_object(struct ias_object *obj);
|
||||
int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib,
|
||||
int cleanobject);
|
||||
void __irias_delete_object(struct ias_object *obj);
|
||||
|
||||
void irias_add_integer_attrib(struct ias_object *obj, char *name, int value,
|
||||
int user);
|
||||
void irias_add_string_attrib(struct ias_object *obj, char *name, char *value,
|
||||
int user);
|
||||
void irias_add_octseq_attrib(struct ias_object *obj, char *name, __u8 *octets,
|
||||
int len, int user);
|
||||
int irias_object_change_attribute(char *obj_name, char *attrib_name,
|
||||
struct ias_value *new_value);
|
||||
struct ias_object *irias_find_object(char *name);
|
||||
struct ias_attrib *irias_find_attrib(struct ias_object *obj, char *name);
|
||||
|
||||
struct ias_value *irias_new_string_value(char *string);
|
||||
struct ias_value *irias_new_integer_value(int integer);
|
||||
struct ias_value *irias_new_octseq_value(__u8 *octseq , int len);
|
||||
struct ias_value *irias_new_missing_value(void);
|
||||
void irias_delete_value(struct ias_value *value);
|
||||
|
||||
extern struct ias_value irias_missing;
|
||||
extern hashbin_t *irias_objects;
|
||||
|
||||
#endif
|
42
include/net/irda/irlan_client.h
Normal file
42
include/net/irda/irlan_client.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_client.h
|
||||
* Version: 0.3
|
||||
* Description: IrDA LAN access layer
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 31 20:14:37 1997
|
||||
* Modified at: Thu Apr 22 14:13:34 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_CLIENT_H
|
||||
#define IRLAN_CLIENT_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <net/irda/irias_object.h>
|
||||
#include <net/irda/irlan_event.h>
|
||||
|
||||
void irlan_client_discovery_indication(discinfo_t *, DISCOVERY_MODE, void *);
|
||||
void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr);
|
||||
|
||||
void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb);
|
||||
void irlan_client_get_value_confirm(int result, __u16 obj_id,
|
||||
struct ias_value *value, void *priv);
|
||||
#endif
|
222
include/net/irda/irlan_common.h
Normal file
222
include/net/irda/irlan_common.h
Normal file
@@ -0,0 +1,222 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_common.h
|
||||
* Version: 0.8
|
||||
* Description: IrDA LAN access layer
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 31 20:14:37 1997
|
||||
* Modified at: Sun Oct 31 19:41:24 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_H
|
||||
#define IRLAN_H
|
||||
|
||||
#include <asm/param.h> /* for HZ */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <net/irda/irttp.h>
|
||||
|
||||
#define IRLAN_MTU 1518
|
||||
#define IRLAN_TIMEOUT 10*HZ /* 10 seconds */
|
||||
|
||||
/* Command packet types */
|
||||
#define CMD_GET_PROVIDER_INFO 0
|
||||
#define CMD_GET_MEDIA_CHAR 1
|
||||
#define CMD_OPEN_DATA_CHANNEL 2
|
||||
#define CMD_CLOSE_DATA_CHAN 3
|
||||
#define CMD_RECONNECT_DATA_CHAN 4
|
||||
#define CMD_FILTER_OPERATION 5
|
||||
|
||||
/* Some responses */
|
||||
#define RSP_SUCCESS 0
|
||||
#define RSP_INSUFFICIENT_RESOURCES 1
|
||||
#define RSP_INVALID_COMMAND_FORMAT 2
|
||||
#define RSP_COMMAND_NOT_SUPPORTED 3
|
||||
#define RSP_PARAM_NOT_SUPPORTED 4
|
||||
#define RSP_VALUE_NOT_SUPPORTED 5
|
||||
#define RSP_NOT_OPEN 6
|
||||
#define RSP_AUTHENTICATION_REQUIRED 7
|
||||
#define RSP_INVALID_PASSWORD 8
|
||||
#define RSP_PROTOCOL_ERROR 9
|
||||
#define RSP_ASYNCHRONOUS_ERROR 255
|
||||
|
||||
/* Media types */
|
||||
#define MEDIA_802_3 1
|
||||
#define MEDIA_802_5 2
|
||||
|
||||
/* Filter parameters */
|
||||
#define DATA_CHAN 1
|
||||
#define FILTER_TYPE 2
|
||||
#define FILTER_MODE 3
|
||||
|
||||
/* Filter types */
|
||||
#define IRLAN_DIRECTED 0x01
|
||||
#define IRLAN_FUNCTIONAL 0x02
|
||||
#define IRLAN_GROUP 0x04
|
||||
#define IRLAN_MAC_FRAME 0x08
|
||||
#define IRLAN_MULTICAST 0x10
|
||||
#define IRLAN_BROADCAST 0x20
|
||||
#define IRLAN_IPX_SOCKET 0x40
|
||||
|
||||
/* Filter modes */
|
||||
#define ALL 1
|
||||
#define FILTER 2
|
||||
#define NONE 3
|
||||
|
||||
/* Filter operations */
|
||||
#define GET 1
|
||||
#define CLEAR 2
|
||||
#define ADD 3
|
||||
#define REMOVE 4
|
||||
#define DYNAMIC 5
|
||||
|
||||
/* Access types */
|
||||
#define ACCESS_DIRECT 1
|
||||
#define ACCESS_PEER 2
|
||||
#define ACCESS_HOSTED 3
|
||||
|
||||
#define IRLAN_BYTE 0
|
||||
#define IRLAN_SHORT 1
|
||||
#define IRLAN_ARRAY 2
|
||||
|
||||
#define IRLAN_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_MAX_HEADER)
|
||||
|
||||
/*
|
||||
* IrLAN client
|
||||
*/
|
||||
struct irlan_client_cb {
|
||||
int state;
|
||||
|
||||
int open_retries;
|
||||
|
||||
struct tsap_cb *tsap_ctrl;
|
||||
__u32 max_sdu_size;
|
||||
__u8 max_header_size;
|
||||
|
||||
int access_type; /* Access type of provider */
|
||||
__u8 reconnect_key[255];
|
||||
__u8 key_len;
|
||||
|
||||
__u16 recv_arb_val;
|
||||
__u16 max_frame;
|
||||
int filter_type;
|
||||
|
||||
int unicast_open;
|
||||
int broadcast_open;
|
||||
|
||||
int tx_busy;
|
||||
struct sk_buff_head txq; /* Transmit control queue */
|
||||
|
||||
struct iriap_cb *iriap;
|
||||
|
||||
struct timer_list kick_timer;
|
||||
};
|
||||
|
||||
/*
|
||||
* IrLAN provider
|
||||
*/
|
||||
struct irlan_provider_cb {
|
||||
int state;
|
||||
|
||||
struct tsap_cb *tsap_ctrl;
|
||||
__u32 max_sdu_size;
|
||||
__u8 max_header_size;
|
||||
|
||||
/*
|
||||
* Store some values here which are used by the provider to parse
|
||||
* the filter operations
|
||||
*/
|
||||
int data_chan;
|
||||
int filter_type;
|
||||
int filter_mode;
|
||||
int filter_operation;
|
||||
int filter_entry;
|
||||
int access_type; /* Access type */
|
||||
__u16 send_arb_val;
|
||||
|
||||
__u8 mac_address[6]; /* Generated MAC address for peer device */
|
||||
};
|
||||
|
||||
/*
|
||||
* IrLAN control block
|
||||
*/
|
||||
struct irlan_cb {
|
||||
int magic;
|
||||
struct list_head dev_list;
|
||||
struct net_device *dev; /* Ethernet device structure*/
|
||||
struct net_device_stats stats;
|
||||
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
int disconnect_reason; /* Why we got disconnected */
|
||||
|
||||
int media; /* Media type */
|
||||
__u8 version[2]; /* IrLAN version */
|
||||
|
||||
struct tsap_cb *tsap_data; /* Data TSAP */
|
||||
|
||||
int use_udata; /* Use Unit Data transfers */
|
||||
|
||||
__u8 stsap_sel_data; /* Source data TSAP selector */
|
||||
__u8 dtsap_sel_data; /* Destination data TSAP selector */
|
||||
__u8 dtsap_sel_ctrl; /* Destination ctrl TSAP selector */
|
||||
|
||||
struct irlan_client_cb client; /* Client specific fields */
|
||||
struct irlan_provider_cb provider; /* Provider specific fields */
|
||||
|
||||
__u32 max_sdu_size;
|
||||
__u8 max_header_size;
|
||||
|
||||
wait_queue_head_t open_wait;
|
||||
struct timer_list watchdog_timer;
|
||||
};
|
||||
|
||||
void irlan_close(struct irlan_cb *self);
|
||||
void irlan_close_tsaps(struct irlan_cb *self);
|
||||
|
||||
int irlan_register_netdev(struct irlan_cb *self);
|
||||
void irlan_ias_register(struct irlan_cb *self, __u8 tsap_sel);
|
||||
void irlan_start_watchdog_timer(struct irlan_cb *self, int timeout);
|
||||
|
||||
void irlan_open_data_tsap(struct irlan_cb *self);
|
||||
|
||||
int irlan_run_ctrl_tx_queue(struct irlan_cb *self);
|
||||
|
||||
struct irlan_cb *irlan_get_any(void);
|
||||
void irlan_get_provider_info(struct irlan_cb *self);
|
||||
void irlan_get_media_char(struct irlan_cb *self);
|
||||
void irlan_open_data_channel(struct irlan_cb *self);
|
||||
void irlan_close_data_channel(struct irlan_cb *self);
|
||||
void irlan_set_multicast_filter(struct irlan_cb *self, int status);
|
||||
void irlan_set_broadcast_filter(struct irlan_cb *self, int status);
|
||||
|
||||
int irlan_insert_byte_param(struct sk_buff *skb, char *param, __u8 value);
|
||||
int irlan_insert_short_param(struct sk_buff *skb, char *param, __u16 value);
|
||||
int irlan_insert_string_param(struct sk_buff *skb, char *param, char *value);
|
||||
int irlan_insert_array_param(struct sk_buff *skb, char *name, __u8 *value,
|
||||
__u16 value_len);
|
||||
|
||||
int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len);
|
||||
|
||||
#endif
|
||||
|
||||
|
33
include/net/irda/irlan_eth.h
Normal file
33
include/net/irda/irlan_eth.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_eth.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Thu Oct 15 08:36:58 1998
|
||||
* Modified at: Fri May 14 23:29:00 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_ETH_H
|
||||
#define IRLAN_ETH_H
|
||||
|
||||
struct net_device *alloc_irlandev(const char *name);
|
||||
int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
|
||||
|
||||
void irlan_eth_flow_indication( void *instance, void *sap, LOCAL_FLOW flow);
|
||||
void irlan_eth_send_gratuitous_arp(struct net_device *dev);
|
||||
#endif
|
81
include/net/irda/irlan_event.h
Normal file
81
include/net/irda/irlan_event.h
Normal file
@@ -0,0 +1,81 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_event.h
|
||||
* Version:
|
||||
* Description: LAN access
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 31 20:14:37 1997
|
||||
* Modified at: Tue Feb 2 09:45:17 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_EVENT_H
|
||||
#define IRLAN_EVENT_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/irda/irlan_common.h>
|
||||
|
||||
typedef enum {
|
||||
IRLAN_IDLE,
|
||||
IRLAN_QUERY,
|
||||
IRLAN_CONN,
|
||||
IRLAN_INFO,
|
||||
IRLAN_MEDIA,
|
||||
IRLAN_OPEN,
|
||||
IRLAN_WAIT,
|
||||
IRLAN_ARB,
|
||||
IRLAN_DATA,
|
||||
IRLAN_CLOSE,
|
||||
IRLAN_SYNC
|
||||
} IRLAN_STATE;
|
||||
|
||||
typedef enum {
|
||||
IRLAN_DISCOVERY_INDICATION,
|
||||
IRLAN_IAS_PROVIDER_AVAIL,
|
||||
IRLAN_IAS_PROVIDER_NOT_AVAIL,
|
||||
IRLAN_LAP_DISCONNECT,
|
||||
IRLAN_LMP_DISCONNECT,
|
||||
IRLAN_CONNECT_COMPLETE,
|
||||
IRLAN_DATA_INDICATION,
|
||||
IRLAN_DATA_CONNECT_INDICATION,
|
||||
IRLAN_RETRY_CONNECT,
|
||||
|
||||
IRLAN_CONNECT_INDICATION,
|
||||
IRLAN_GET_INFO_CMD,
|
||||
IRLAN_GET_MEDIA_CMD,
|
||||
IRLAN_OPEN_DATA_CMD,
|
||||
IRLAN_FILTER_CONFIG_CMD,
|
||||
|
||||
IRLAN_CHECK_CON_ARB,
|
||||
IRLAN_PROVIDER_SIGNAL,
|
||||
|
||||
IRLAN_WATCHDOG_TIMEOUT,
|
||||
} IRLAN_EVENT;
|
||||
|
||||
extern char *irlan_state[];
|
||||
|
||||
void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void irlan_do_provider_event(struct irlan_cb *self, IRLAN_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void irlan_next_client_state(struct irlan_cb *self, IRLAN_STATE state);
|
||||
void irlan_next_provider_state(struct irlan_cb *self, IRLAN_STATE state);
|
||||
|
||||
#endif
|
33
include/net/irda/irlan_filter.h
Normal file
33
include/net/irda/irlan_filter.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_filter.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Fri Jan 29 15:24:08 1999
|
||||
* Modified at: Sun Feb 7 23:35:31 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_FILTER_H
|
||||
#define IRLAN_FILTER_H
|
||||
|
||||
void irlan_check_command_param(struct irlan_cb *self, char *param,
|
||||
char *value);
|
||||
void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb);
|
||||
int irlan_print_filter(struct seq_file *seq, int filter_type);
|
||||
|
||||
#endif /* IRLAN_FILTER_H */
|
52
include/net/irda/irlan_provider.h
Normal file
52
include/net/irda/irlan_provider.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlan_provider.h
|
||||
* Version: 0.1
|
||||
* Description: IrDA LAN access layer
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 31 20:14:37 1997
|
||||
* Modified at: Sun May 9 12:26:11 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAN_SERVER_H
|
||||
#define IRLAN_SERVER_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <net/irda/irlan_common.h>
|
||||
|
||||
void irlan_provider_ctrl_disconnect_indication(void *instance, void *sap,
|
||||
LM_REASON reason,
|
||||
struct sk_buff *skb);
|
||||
|
||||
|
||||
void irlan_provider_connect_response(struct irlan_cb *, struct tsap_cb *);
|
||||
|
||||
int irlan_parse_open_data_cmd(struct irlan_cb *self, struct sk_buff *skb);
|
||||
int irlan_provider_parse_command(struct irlan_cb *self, int cmd,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void irlan_provider_send_reply(struct irlan_cb *self, int command,
|
||||
int ret_code);
|
||||
int irlan_provider_open_ctrl_tsap(struct irlan_cb *self);
|
||||
|
||||
#endif
|
||||
|
||||
|
290
include/net/irda/irlap.h
Normal file
290
include/net/irda/irlap.h
Normal file
@@ -0,0 +1,290 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlap.h
|
||||
* Version: 0.8
|
||||
* Description: An IrDA LAP driver for Linux
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Aug 4 20:40:53 1997
|
||||
* Modified at: Fri Dec 10 13:21:17 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAP_H
|
||||
#define IRLAP_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <net/irda/irqueue.h> /* irda_queue_t */
|
||||
#include <net/irda/qos.h> /* struct qos_info */
|
||||
#include <net/irda/discovery.h> /* discovery_t */
|
||||
#include <net/irda/irlap_event.h> /* IRLAP_STATE, ... */
|
||||
#include <net/irda/irmod.h> /* struct notify_t */
|
||||
|
||||
#define CONFIG_IRDA_DYNAMIC_WINDOW 1
|
||||
|
||||
#define LAP_RELIABLE 1
|
||||
#define LAP_UNRELIABLE 0
|
||||
|
||||
#define LAP_ADDR_HEADER 1 /* IrLAP Address Header */
|
||||
#define LAP_CTRL_HEADER 1 /* IrLAP Control Header */
|
||||
|
||||
/* May be different when we get VFIR */
|
||||
#define LAP_MAX_HEADER (LAP_ADDR_HEADER + LAP_CTRL_HEADER)
|
||||
|
||||
#define BROADCAST 0xffffffff /* Broadcast device address */
|
||||
#define CBROADCAST 0xfe /* Connection broadcast address */
|
||||
#define XID_FORMAT 0x01 /* Discovery XID format */
|
||||
|
||||
/* Nobody seems to use this constant. */
|
||||
#define LAP_WINDOW_SIZE 8
|
||||
/* We keep the LAP queue very small to minimise the amount of buffering.
|
||||
* this improve latency and reduce resource consumption.
|
||||
* This work only because we have synchronous refilling of IrLAP through
|
||||
* the flow control mechanism (via scheduler and IrTTP).
|
||||
* 2 buffers is the minimum we can work with, one that we send while polling
|
||||
* IrTTP, and another to know that we should not send the pf bit.
|
||||
* Jean II */
|
||||
#define LAP_HIGH_THRESHOLD 2
|
||||
/* Some rare non TTP clients don't implement flow control, and
|
||||
* so don't comply with the above limit (and neither with this one).
|
||||
* For IAP and management, it doesn't matter, because they never transmit much.
|
||||
*.For IrLPT, this should be fixed.
|
||||
* - Jean II */
|
||||
#define LAP_MAX_QUEUE 10
|
||||
/* Please note that all IrDA management frames (LMP/TTP conn req/disc and
|
||||
* IAS queries) fall in the second category and are sent to LAP even if TTP
|
||||
* is stopped. This means that those frames will wait only a maximum of
|
||||
* two (2) data frames before beeing sent on the "wire", which speed up
|
||||
* new socket setup when the link is saturated.
|
||||
* Same story for two sockets competing for the medium : if one saturates
|
||||
* the LAP, when the other want to transmit it only has to wait for
|
||||
* maximum three (3) packets (2 + one scheduling), which improve performance
|
||||
* of delay sensitive applications.
|
||||
* Jean II */
|
||||
|
||||
#define NR_EXPECTED 1
|
||||
#define NR_UNEXPECTED 0
|
||||
#define NR_INVALID -1
|
||||
|
||||
#define NS_EXPECTED 1
|
||||
#define NS_UNEXPECTED 0
|
||||
#define NS_INVALID -1
|
||||
|
||||
/*
|
||||
* Meta information passed within the IrLAP state machine
|
||||
*/
|
||||
struct irlap_info {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control; /* Frame type */
|
||||
__u8 cmd;
|
||||
|
||||
__u32 saddr;
|
||||
__u32 daddr;
|
||||
|
||||
int pf; /* Poll/final bit set */
|
||||
|
||||
__u8 nr; /* Sequence number of next frame expected */
|
||||
__u8 ns; /* Sequence number of frame sent */
|
||||
|
||||
int S; /* Number of slots */
|
||||
int slot; /* Random chosen slot */
|
||||
int s; /* Current slot */
|
||||
|
||||
discovery_t *discovery; /* Discovery information */
|
||||
};
|
||||
|
||||
/* Main structure of IrLAP */
|
||||
struct irlap_cb {
|
||||
irda_queue_t q; /* Must be first */
|
||||
magic_t magic;
|
||||
|
||||
/* Device we are attached to */
|
||||
struct net_device *netdev;
|
||||
char hw_name[2*IFNAMSIZ + 1];
|
||||
|
||||
/* Connection state */
|
||||
volatile IRLAP_STATE state; /* Current state */
|
||||
|
||||
/* Timers used by IrLAP */
|
||||
struct timer_list query_timer;
|
||||
struct timer_list slot_timer;
|
||||
struct timer_list discovery_timer;
|
||||
struct timer_list final_timer;
|
||||
struct timer_list poll_timer;
|
||||
struct timer_list wd_timer;
|
||||
struct timer_list backoff_timer;
|
||||
|
||||
/* Media busy stuff */
|
||||
struct timer_list media_busy_timer;
|
||||
int media_busy;
|
||||
|
||||
/* Timeouts which will be different with different turn time */
|
||||
int slot_timeout;
|
||||
int poll_timeout;
|
||||
int final_timeout;
|
||||
int wd_timeout;
|
||||
|
||||
struct sk_buff_head txq; /* Frames to be transmitted */
|
||||
struct sk_buff_head txq_ultra;
|
||||
|
||||
__u8 caddr; /* Connection address */
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
|
||||
int retry_count; /* Times tried to establish connection */
|
||||
int add_wait; /* True if we are waiting for frame */
|
||||
|
||||
__u8 connect_pending;
|
||||
__u8 disconnect_pending;
|
||||
|
||||
/* To send a faster RR if tx queue empty */
|
||||
#ifdef CONFIG_IRDA_FAST_RR
|
||||
int fast_RR_timeout;
|
||||
int fast_RR;
|
||||
#endif /* CONFIG_IRDA_FAST_RR */
|
||||
|
||||
int N1; /* N1 * F-timer = Negitiated link disconnect warning threshold */
|
||||
int N2; /* N2 * F-timer = Negitiated link disconnect time */
|
||||
int N3; /* Connection retry count */
|
||||
|
||||
int local_busy;
|
||||
int remote_busy;
|
||||
int xmitflag;
|
||||
|
||||
__u8 vs; /* Next frame to be sent */
|
||||
__u8 vr; /* Next frame to be received */
|
||||
__u8 va; /* Last frame acked */
|
||||
int window; /* Nr of I-frames allowed to send */
|
||||
int window_size; /* Current negotiated window size */
|
||||
|
||||
#ifdef CONFIG_IRDA_DYNAMIC_WINDOW
|
||||
__u32 line_capacity; /* Number of bytes allowed to send */
|
||||
__u32 bytes_left; /* Number of bytes still allowed to transmit */
|
||||
#endif /* CONFIG_IRDA_DYNAMIC_WINDOW */
|
||||
|
||||
struct sk_buff_head wx_list;
|
||||
|
||||
__u8 ack_required;
|
||||
|
||||
/* XID parameters */
|
||||
__u8 S; /* Number of slots */
|
||||
__u8 slot; /* Random chosen slot */
|
||||
__u8 s; /* Current slot */
|
||||
int frame_sent; /* Have we sent reply? */
|
||||
|
||||
hashbin_t *discovery_log;
|
||||
discovery_t *discovery_cmd;
|
||||
|
||||
__u32 speed; /* Link speed */
|
||||
|
||||
struct qos_info qos_tx; /* QoS requested by peer */
|
||||
struct qos_info qos_rx; /* QoS requested by self */
|
||||
struct qos_info *qos_dev; /* QoS supported by device */
|
||||
|
||||
notify_t notify; /* Callbacks to IrLMP */
|
||||
|
||||
int mtt_required; /* Minumum turnaround time required */
|
||||
int xbofs_delay; /* Nr of XBOF's used to MTT */
|
||||
int bofs_count; /* Negotiated extra BOFs */
|
||||
int next_bofs; /* Negotiated extra BOFs after next frame */
|
||||
};
|
||||
|
||||
/*
|
||||
* Function prototypes
|
||||
*/
|
||||
int irlap_init(void);
|
||||
void irlap_cleanup(void);
|
||||
|
||||
struct irlap_cb *irlap_open(struct net_device *dev, struct qos_info *qos,
|
||||
const char *hw_name);
|
||||
void irlap_close(struct irlap_cb *self);
|
||||
|
||||
void irlap_connect_request(struct irlap_cb *self, __u32 daddr,
|
||||
struct qos_info *qos, int sniff);
|
||||
void irlap_connect_response(struct irlap_cb *self, struct sk_buff *skb);
|
||||
void irlap_connect_indication(struct irlap_cb *self, struct sk_buff *skb);
|
||||
void irlap_connect_confirm(struct irlap_cb *, struct sk_buff *skb);
|
||||
|
||||
void irlap_data_indication(struct irlap_cb *, struct sk_buff *, int unreliable);
|
||||
void irlap_data_request(struct irlap_cb *, struct sk_buff *, int unreliable);
|
||||
|
||||
#ifdef CONFIG_IRDA_ULTRA
|
||||
void irlap_unitdata_request(struct irlap_cb *, struct sk_buff *);
|
||||
void irlap_unitdata_indication(struct irlap_cb *, struct sk_buff *);
|
||||
#endif /* CONFIG_IRDA_ULTRA */
|
||||
|
||||
void irlap_disconnect_request(struct irlap_cb *);
|
||||
void irlap_disconnect_indication(struct irlap_cb *, LAP_REASON reason);
|
||||
|
||||
void irlap_status_indication(struct irlap_cb *, int quality_of_link);
|
||||
|
||||
void irlap_test_request(__u8 *info, int len);
|
||||
|
||||
void irlap_discovery_request(struct irlap_cb *, discovery_t *discovery);
|
||||
void irlap_discovery_confirm(struct irlap_cb *, hashbin_t *discovery_log);
|
||||
void irlap_discovery_indication(struct irlap_cb *, discovery_t *discovery);
|
||||
|
||||
void irlap_reset_indication(struct irlap_cb *self);
|
||||
void irlap_reset_confirm(void);
|
||||
|
||||
void irlap_update_nr_received(struct irlap_cb *, int nr);
|
||||
int irlap_validate_nr_received(struct irlap_cb *, int nr);
|
||||
int irlap_validate_ns_received(struct irlap_cb *, int ns);
|
||||
|
||||
int irlap_generate_rand_time_slot(int S, int s);
|
||||
void irlap_initiate_connection_state(struct irlap_cb *);
|
||||
void irlap_flush_all_queues(struct irlap_cb *);
|
||||
void irlap_wait_min_turn_around(struct irlap_cb *, struct qos_info *);
|
||||
|
||||
void irlap_apply_default_connection_parameters(struct irlap_cb *self);
|
||||
void irlap_apply_connection_parameters(struct irlap_cb *self, int now);
|
||||
|
||||
#define IRLAP_GET_HEADER_SIZE(self) (LAP_MAX_HEADER)
|
||||
#define IRLAP_GET_TX_QUEUE_LEN(self) skb_queue_len(&self->txq)
|
||||
|
||||
/* Return TRUE if the node is in primary mode (i.e. master)
|
||||
* - Jean II */
|
||||
static inline int irlap_is_primary(struct irlap_cb *self)
|
||||
{
|
||||
int ret;
|
||||
switch(self->state) {
|
||||
case LAP_XMIT_P:
|
||||
case LAP_NRM_P:
|
||||
ret = 1;
|
||||
break;
|
||||
case LAP_XMIT_S:
|
||||
case LAP_NRM_S:
|
||||
ret = 0;
|
||||
break;
|
||||
default:
|
||||
ret = -1;
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/* Clear a pending IrLAP disconnect. - Jean II */
|
||||
static inline void irlap_clear_disconnect(struct irlap_cb *self)
|
||||
{
|
||||
self->disconnect_pending = FALSE;
|
||||
}
|
||||
|
||||
#endif
|
131
include/net/irda/irlap_event.h
Normal file
131
include/net/irda/irlap_event.h
Normal file
@@ -0,0 +1,131 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
*
|
||||
* Filename: irlap_event.h
|
||||
* Version: 0.1
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sat Aug 16 00:59:29 1997
|
||||
* Modified at: Tue Dec 21 11:20:30 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAP_EVENT_H
|
||||
#define IRLAP_EVENT_H
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct irlap_cb;
|
||||
struct irlap_info;
|
||||
|
||||
/* IrLAP States */
|
||||
typedef enum {
|
||||
LAP_NDM, /* Normal disconnected mode */
|
||||
LAP_QUERY,
|
||||
LAP_REPLY,
|
||||
LAP_CONN, /* Connect indication */
|
||||
LAP_SETUP, /* Setting up connection */
|
||||
LAP_OFFLINE, /* A really boring state */
|
||||
LAP_XMIT_P,
|
||||
LAP_PCLOSE,
|
||||
LAP_NRM_P, /* Normal response mode as primary */
|
||||
LAP_RESET_WAIT,
|
||||
LAP_RESET,
|
||||
LAP_NRM_S, /* Normal response mode as secondary */
|
||||
LAP_XMIT_S,
|
||||
LAP_SCLOSE,
|
||||
LAP_RESET_CHECK,
|
||||
} IRLAP_STATE;
|
||||
|
||||
/* IrLAP Events */
|
||||
typedef enum {
|
||||
/* Services events */
|
||||
DISCOVERY_REQUEST,
|
||||
CONNECT_REQUEST,
|
||||
CONNECT_RESPONSE,
|
||||
DISCONNECT_REQUEST,
|
||||
DATA_REQUEST,
|
||||
RESET_REQUEST,
|
||||
RESET_RESPONSE,
|
||||
|
||||
/* Send events */
|
||||
SEND_I_CMD,
|
||||
SEND_UI_FRAME,
|
||||
|
||||
/* Receive events */
|
||||
RECV_DISCOVERY_XID_CMD,
|
||||
RECV_DISCOVERY_XID_RSP,
|
||||
RECV_SNRM_CMD,
|
||||
RECV_TEST_CMD,
|
||||
RECV_TEST_RSP,
|
||||
RECV_UA_RSP,
|
||||
RECV_DM_RSP,
|
||||
RECV_RD_RSP,
|
||||
RECV_I_CMD,
|
||||
RECV_I_RSP,
|
||||
RECV_UI_FRAME,
|
||||
RECV_FRMR_RSP,
|
||||
RECV_RR_CMD,
|
||||
RECV_RR_RSP,
|
||||
RECV_RNR_CMD,
|
||||
RECV_RNR_RSP,
|
||||
RECV_REJ_CMD,
|
||||
RECV_REJ_RSP,
|
||||
RECV_SREJ_CMD,
|
||||
RECV_SREJ_RSP,
|
||||
RECV_DISC_CMD,
|
||||
|
||||
/* Timer events */
|
||||
SLOT_TIMER_EXPIRED,
|
||||
QUERY_TIMER_EXPIRED,
|
||||
FINAL_TIMER_EXPIRED,
|
||||
POLL_TIMER_EXPIRED,
|
||||
DISCOVERY_TIMER_EXPIRED,
|
||||
WD_TIMER_EXPIRED,
|
||||
BACKOFF_TIMER_EXPIRED,
|
||||
MEDIA_BUSY_TIMER_EXPIRED,
|
||||
} IRLAP_EVENT;
|
||||
|
||||
/*
|
||||
* Disconnect reason code
|
||||
*/
|
||||
typedef enum { /* FIXME check the two first reason codes */
|
||||
LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
|
||||
LAP_NO_RESPONSE, /* To many retransmits without response */
|
||||
LAP_RESET_INDICATION, /* To many retransmits, or invalid nr/ns */
|
||||
LAP_FOUND_NONE, /* No devices were discovered */
|
||||
LAP_MEDIA_BUSY,
|
||||
LAP_PRIMARY_CONFLICT,
|
||||
} LAP_REASON;
|
||||
|
||||
extern const char *irlap_state[];
|
||||
|
||||
void irlap_do_event(struct irlap_cb *self, IRLAP_EVENT event,
|
||||
struct sk_buff *skb, struct irlap_info *info);
|
||||
void irlap_print_event(IRLAP_EVENT event);
|
||||
|
||||
extern int irlap_qos_negotiate(struct irlap_cb *self, struct sk_buff *skb);
|
||||
|
||||
#endif
|
142
include/net/irda/irlap_frame.h
Normal file
142
include/net/irda/irlap_frame.h
Normal file
@@ -0,0 +1,142 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlap_frame.h
|
||||
* Version: 0.9
|
||||
* Description: IrLAP frame declarations
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Aug 19 10:27:26 1997
|
||||
* Modified at: Sat Dec 25 21:07:26 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLAP_FRAME_H
|
||||
#define IRLAP_FRAME_H
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct irlap_cb;
|
||||
struct discovery_t;
|
||||
|
||||
/* Frame types and templates */
|
||||
#define INVALID 0xff
|
||||
|
||||
/* Unnumbered (U) commands */
|
||||
#define SNRM_CMD 0x83 /* Set Normal Response Mode */
|
||||
#define DISC_CMD 0x43 /* Disconnect */
|
||||
#define XID_CMD 0x2f /* Exchange Station Identification */
|
||||
#define TEST_CMD 0xe3 /* Test */
|
||||
|
||||
/* Unnumbered responses */
|
||||
#define RNRM_RSP 0x83 /* Request Normal Response Mode */
|
||||
#define UA_RSP 0x63 /* Unnumbered Acknowledgement */
|
||||
#define FRMR_RSP 0x87 /* Frame Reject */
|
||||
#define DM_RSP 0x0f /* Disconnect Mode */
|
||||
#define RD_RSP 0x43 /* Request Disconnection */
|
||||
#define XID_RSP 0xaf /* Exchange Station Identification */
|
||||
#define TEST_RSP 0xe3 /* Test frame */
|
||||
|
||||
/* Supervisory (S) */
|
||||
#define RR 0x01 /* Receive Ready */
|
||||
#define REJ 0x09 /* Reject */
|
||||
#define RNR 0x05 /* Receive Not Ready */
|
||||
#define SREJ 0x0d /* Selective Reject */
|
||||
|
||||
/* Information (I) */
|
||||
#define I_FRAME 0x00 /* Information Format */
|
||||
#define UI_FRAME 0x03 /* Unnumbered Information */
|
||||
|
||||
#define CMD_FRAME 0x01
|
||||
#define RSP_FRAME 0x00
|
||||
|
||||
#define PF_BIT 0x10 /* Poll/final bit */
|
||||
|
||||
struct xid_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
__u8 ident; /* Should always be XID_FORMAT */
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
__u8 flags; /* Discovery flags */
|
||||
__u8 slotnr;
|
||||
__u8 version;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct test_frame {
|
||||
__u8 caddr; /* Connection address */
|
||||
__u8 control;
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
} IRDA_PACK;
|
||||
|
||||
struct ua_frame {
|
||||
__u8 caddr;
|
||||
__u8 control;
|
||||
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Dest device address */
|
||||
} IRDA_PACK;
|
||||
|
||||
struct i_frame {
|
||||
__u8 caddr;
|
||||
__u8 control;
|
||||
} IRDA_PACK;
|
||||
|
||||
struct snrm_frame {
|
||||
__u8 caddr;
|
||||
__u8 control;
|
||||
__u32 saddr;
|
||||
__u32 daddr;
|
||||
__u8 ncaddr;
|
||||
} IRDA_PACK;
|
||||
|
||||
void irlap_queue_xmit(struct irlap_cb *self, struct sk_buff *skb);
|
||||
void irlap_send_discovery_xid_frame(struct irlap_cb *, int S, __u8 s,
|
||||
__u8 command,
|
||||
struct discovery_t *discovery);
|
||||
void irlap_send_snrm_frame(struct irlap_cb *, struct qos_info *);
|
||||
void irlap_send_test_frame(struct irlap_cb *self, __u8 caddr, __u32 daddr,
|
||||
struct sk_buff *cmd);
|
||||
void irlap_send_ua_response_frame(struct irlap_cb *, struct qos_info *);
|
||||
void irlap_send_dm_frame(struct irlap_cb *self);
|
||||
void irlap_send_rd_frame(struct irlap_cb *self);
|
||||
void irlap_send_disc_frame(struct irlap_cb *self);
|
||||
void irlap_send_rr_frame(struct irlap_cb *self, int command);
|
||||
|
||||
void irlap_send_data_primary(struct irlap_cb *, struct sk_buff *);
|
||||
void irlap_send_data_primary_poll(struct irlap_cb *, struct sk_buff *);
|
||||
void irlap_send_data_secondary(struct irlap_cb *, struct sk_buff *);
|
||||
void irlap_send_data_secondary_final(struct irlap_cb *, struct sk_buff *);
|
||||
void irlap_resend_rejected_frames(struct irlap_cb *, int command);
|
||||
void irlap_resend_rejected_frame(struct irlap_cb *self, int command);
|
||||
|
||||
void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb,
|
||||
__u8 caddr, int command);
|
||||
|
||||
extern int irlap_insert_qos_negotiation_params(struct irlap_cb *self,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#endif
|
295
include/net/irda/irlmp.h
Normal file
295
include/net/irda/irlmp.h
Normal file
@@ -0,0 +1,295 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlmp.h
|
||||
* Version: 0.9
|
||||
* Description: IrDA Link Management Protocol (LMP) layer
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 17 20:54:32 1997
|
||||
* Modified at: Fri Dec 10 13:23:01 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLMP_H
|
||||
#define IRLMP_H
|
||||
|
||||
#include <asm/param.h> /* for HZ */
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/qos.h>
|
||||
#include <net/irda/irlap.h> /* LAP_MAX_HEADER, ... */
|
||||
#include <net/irda/irlmp_event.h>
|
||||
#include <net/irda/irqueue.h>
|
||||
#include <net/irda/discovery.h>
|
||||
|
||||
/* LSAP-SEL's */
|
||||
#define LSAP_MASK 0x7f
|
||||
#define LSAP_IAS 0x00
|
||||
#define LSAP_ANY 0xff
|
||||
#define LSAP_MAX 0x6f /* 0x70-0x7f are reserved */
|
||||
#define LSAP_CONNLESS 0x70 /* Connectionless LSAP, mostly used for Ultra */
|
||||
|
||||
#define DEV_ADDR_ANY 0xffffffff
|
||||
|
||||
#define LMP_HEADER 2 /* Dest LSAP + Source LSAP */
|
||||
#define LMP_CONTROL_HEADER 4
|
||||
#define LMP_PID_HEADER 1 /* Used by Ultra */
|
||||
#define LMP_MAX_HEADER (LMP_CONTROL_HEADER+LAP_MAX_HEADER)
|
||||
|
||||
#define LM_MAX_CONNECTIONS 10
|
||||
|
||||
#define LM_IDLE_TIMEOUT 2*HZ /* 2 seconds for now */
|
||||
|
||||
typedef enum {
|
||||
S_PNP = 0,
|
||||
S_PDA,
|
||||
S_COMPUTER,
|
||||
S_PRINTER,
|
||||
S_MODEM,
|
||||
S_FAX,
|
||||
S_LAN,
|
||||
S_TELEPHONY,
|
||||
S_COMM,
|
||||
S_OBEX,
|
||||
S_ANY,
|
||||
S_END,
|
||||
} SERVICE;
|
||||
|
||||
/* For selective discovery */
|
||||
typedef void (*DISCOVERY_CALLBACK1) (discinfo_t *, DISCOVERY_MODE, void *);
|
||||
/* For expiry (the same) */
|
||||
typedef void (*DISCOVERY_CALLBACK2) (discinfo_t *, DISCOVERY_MODE, void *);
|
||||
|
||||
typedef struct {
|
||||
irda_queue_t queue; /* Must be first */
|
||||
|
||||
__u16_host_order hints; /* Hint bits */
|
||||
} irlmp_service_t;
|
||||
|
||||
typedef struct {
|
||||
irda_queue_t queue; /* Must be first */
|
||||
|
||||
__u16_host_order hint_mask;
|
||||
|
||||
DISCOVERY_CALLBACK1 disco_callback; /* Selective discovery */
|
||||
DISCOVERY_CALLBACK2 expir_callback; /* Selective expiration */
|
||||
void *priv; /* Used to identify client */
|
||||
} irlmp_client_t;
|
||||
|
||||
/*
|
||||
* Information about each logical LSAP connection
|
||||
*/
|
||||
struct lsap_cb {
|
||||
irda_queue_t queue; /* Must be first */
|
||||
magic_t magic;
|
||||
|
||||
unsigned long connected; /* set_bit used on this */
|
||||
int persistent;
|
||||
|
||||
__u8 slsap_sel; /* Source (this) LSAP address */
|
||||
__u8 dlsap_sel; /* Destination LSAP address (if connected) */
|
||||
#ifdef CONFIG_IRDA_ULTRA
|
||||
__u8 pid; /* Used by connectionless LSAP */
|
||||
#endif /* CONFIG_IRDA_ULTRA */
|
||||
struct sk_buff *conn_skb; /* Store skb here while connecting */
|
||||
|
||||
struct timer_list watchdog_timer;
|
||||
|
||||
IRLMP_STATE lsap_state; /* Connection state */
|
||||
notify_t notify; /* Indication/Confirm entry points */
|
||||
struct qos_info qos; /* QoS for this connection */
|
||||
|
||||
struct lap_cb *lap; /* Pointer to LAP connection structure */
|
||||
};
|
||||
|
||||
/*
|
||||
* Used for caching the last slsap->dlsap->handle mapping
|
||||
*
|
||||
* We don't need to keep/match the remote address in the cache because
|
||||
* we are associated with a specific LAP (which implies it).
|
||||
* Jean II
|
||||
*/
|
||||
typedef struct {
|
||||
int valid;
|
||||
|
||||
__u8 slsap_sel;
|
||||
__u8 dlsap_sel;
|
||||
struct lsap_cb *lsap;
|
||||
} CACHE_ENTRY;
|
||||
|
||||
/*
|
||||
* Information about each registred IrLAP layer
|
||||
*/
|
||||
struct lap_cb {
|
||||
irda_queue_t queue; /* Must be first */
|
||||
magic_t magic;
|
||||
|
||||
int reason; /* LAP disconnect reason */
|
||||
|
||||
IRLMP_STATE lap_state;
|
||||
|
||||
struct irlap_cb *irlap; /* Instance of IrLAP layer */
|
||||
hashbin_t *lsaps; /* LSAP associated with this link */
|
||||
struct lsap_cb *flow_next; /* Next lsap to be polled for Tx */
|
||||
|
||||
__u8 caddr; /* Connection address */
|
||||
__u32 saddr; /* Source device address */
|
||||
__u32 daddr; /* Destination device address */
|
||||
|
||||
struct qos_info *qos; /* LAP QoS for this session */
|
||||
struct timer_list idle_timer;
|
||||
|
||||
#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
|
||||
/* The lsap cache was moved from struct irlmp_cb to here because
|
||||
* it must be associated with the specific LAP. Also, this
|
||||
* improves performance. - Jean II */
|
||||
CACHE_ENTRY cache; /* Caching last slsap->dlsap->handle mapping */
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* Main structure for IrLMP
|
||||
*/
|
||||
struct irlmp_cb {
|
||||
magic_t magic;
|
||||
|
||||
__u8 conflict_flag;
|
||||
|
||||
discovery_t discovery_cmd; /* Discovery command to use by IrLAP */
|
||||
discovery_t discovery_rsp; /* Discovery response to use by IrLAP */
|
||||
|
||||
/* Last lsap picked automatically by irlmp_find_free_slsap() */
|
||||
int last_lsap_sel;
|
||||
|
||||
struct timer_list discovery_timer;
|
||||
|
||||
hashbin_t *links; /* IrLAP connection table */
|
||||
hashbin_t *unconnected_lsaps;
|
||||
hashbin_t *clients;
|
||||
hashbin_t *services;
|
||||
|
||||
hashbin_t *cachelog; /* Current discovery log */
|
||||
|
||||
int running;
|
||||
|
||||
__u16_host_order hints; /* Hint bits */
|
||||
};
|
||||
|
||||
/* Prototype declarations */
|
||||
int irlmp_init(void);
|
||||
void irlmp_cleanup(void);
|
||||
struct lsap_cb *irlmp_open_lsap(__u8 slsap, notify_t *notify, __u8 pid);
|
||||
void irlmp_close_lsap( struct lsap_cb *self);
|
||||
|
||||
__u16 irlmp_service_to_hint(int service);
|
||||
void *irlmp_register_service(__u16 hints);
|
||||
int irlmp_unregister_service(void *handle);
|
||||
void *irlmp_register_client(__u16 hint_mask, DISCOVERY_CALLBACK1 disco_clb,
|
||||
DISCOVERY_CALLBACK2 expir_clb, void *priv);
|
||||
int irlmp_unregister_client(void *handle);
|
||||
int irlmp_update_client(void *handle, __u16 hint_mask,
|
||||
DISCOVERY_CALLBACK1 disco_clb,
|
||||
DISCOVERY_CALLBACK2 expir_clb, void *priv);
|
||||
|
||||
void irlmp_register_link(struct irlap_cb *, __u32 saddr, notify_t *);
|
||||
void irlmp_unregister_link(__u32 saddr);
|
||||
|
||||
int irlmp_connect_request(struct lsap_cb *, __u8 dlsap_sel,
|
||||
__u32 saddr, __u32 daddr,
|
||||
struct qos_info *, struct sk_buff *);
|
||||
void irlmp_connect_indication(struct lsap_cb *self, struct sk_buff *skb);
|
||||
int irlmp_connect_response(struct lsap_cb *, struct sk_buff *);
|
||||
void irlmp_connect_confirm(struct lsap_cb *, struct sk_buff *);
|
||||
struct lsap_cb *irlmp_dup(struct lsap_cb *self, void *instance);
|
||||
|
||||
void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason,
|
||||
struct sk_buff *userdata);
|
||||
int irlmp_disconnect_request(struct lsap_cb *, struct sk_buff *userdata);
|
||||
|
||||
void irlmp_discovery_confirm(hashbin_t *discovery_log, DISCOVERY_MODE mode);
|
||||
void irlmp_discovery_request(int nslots);
|
||||
discinfo_t *irlmp_get_discoveries(int *pn, __u16 mask, int nslots);
|
||||
void irlmp_do_expiry(void);
|
||||
void irlmp_do_discovery(int nslots);
|
||||
discovery_t *irlmp_get_discovery_response(void);
|
||||
void irlmp_discovery_expiry(discinfo_t *expiry, int number);
|
||||
|
||||
int irlmp_data_request(struct lsap_cb *, struct sk_buff *);
|
||||
void irlmp_data_indication(struct lsap_cb *, struct sk_buff *);
|
||||
|
||||
int irlmp_udata_request(struct lsap_cb *, struct sk_buff *);
|
||||
void irlmp_udata_indication(struct lsap_cb *, struct sk_buff *);
|
||||
|
||||
#ifdef CONFIG_IRDA_ULTRA
|
||||
int irlmp_connless_data_request(struct lsap_cb *, struct sk_buff *, __u8);
|
||||
void irlmp_connless_data_indication(struct lsap_cb *, struct sk_buff *);
|
||||
#endif /* CONFIG_IRDA_ULTRA */
|
||||
|
||||
void irlmp_status_indication(struct lap_cb *, LINK_STATUS link, LOCK_STATUS lock);
|
||||
void irlmp_flow_indication(struct lap_cb *self, LOCAL_FLOW flow);
|
||||
|
||||
LM_REASON irlmp_convert_lap_reason(LAP_REASON);
|
||||
|
||||
static inline __u32 irlmp_get_saddr(const struct lsap_cb *self)
|
||||
{
|
||||
return (self && self->lap) ? self->lap->saddr : 0;
|
||||
}
|
||||
|
||||
static inline __u32 irlmp_get_daddr(const struct lsap_cb *self)
|
||||
{
|
||||
return (self && self->lap) ? self->lap->daddr : 0;
|
||||
}
|
||||
|
||||
extern const char *irlmp_reasons[];
|
||||
extern int sysctl_discovery_timeout;
|
||||
extern int sysctl_discovery_slots;
|
||||
extern int sysctl_discovery;
|
||||
extern int sysctl_lap_keepalive_time; /* in ms, default is LM_IDLE_TIMEOUT */
|
||||
extern struct irlmp_cb *irlmp;
|
||||
|
||||
/* Check if LAP queue is full.
|
||||
* Used by IrTTP for low control, see comments in irlap.h - Jean II */
|
||||
static inline int irlmp_lap_tx_queue_full(struct lsap_cb *self)
|
||||
{
|
||||
if (self == NULL)
|
||||
return 0;
|
||||
if (self->lap == NULL)
|
||||
return 0;
|
||||
if (self->lap->irlap == NULL)
|
||||
return 0;
|
||||
|
||||
return(IRLAP_GET_TX_QUEUE_LEN(self->lap->irlap) >= LAP_HIGH_THRESHOLD);
|
||||
}
|
||||
|
||||
/* After doing a irlmp_dup(), this get one of the two socket back into
|
||||
* a state where it's waiting incomming connections.
|
||||
* Note : this can be used *only* if the socket is not yet connected
|
||||
* (i.e. NO irlmp_connect_response() done on this socket).
|
||||
* - Jean II */
|
||||
static inline void irlmp_listen(struct lsap_cb *self)
|
||||
{
|
||||
self->dlsap_sel = LSAP_ANY;
|
||||
self->lap = NULL;
|
||||
self->lsap_state = LSAP_DISCONNECTED;
|
||||
/* Started when we received the LM_CONNECT_INDICATION */
|
||||
del_timer(&self->watchdog_timer);
|
||||
}
|
||||
|
||||
#endif
|
98
include/net/irda/irlmp_event.h
Normal file
98
include/net/irda/irlmp_event.h
Normal file
@@ -0,0 +1,98 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlmp_event.h
|
||||
* Version: 0.1
|
||||
* Description: IrDA-LMP event handling
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Aug 4 20:40:53 1997
|
||||
* Modified at: Thu Jul 8 12:18:54 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRLMP_EVENT_H
|
||||
#define IRLMP_EVENT_H
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct irlmp_cb;
|
||||
struct lsap_cb;
|
||||
struct lap_cb;
|
||||
struct discovery_t;
|
||||
|
||||
/* LAP states */
|
||||
typedef enum {
|
||||
/* IrLAP connection control states */
|
||||
LAP_STANDBY, /* No LAP connection */
|
||||
LAP_U_CONNECT, /* Starting LAP connection */
|
||||
LAP_ACTIVE, /* LAP connection is active */
|
||||
} IRLMP_STATE;
|
||||
|
||||
/* LSAP connection control states */
|
||||
typedef enum {
|
||||
LSAP_DISCONNECTED, /* No LSAP connection */
|
||||
LSAP_CONNECT, /* Connect indication from peer */
|
||||
LSAP_CONNECT_PEND, /* Connect request from service user */
|
||||
LSAP_DATA_TRANSFER_READY, /* LSAP connection established */
|
||||
LSAP_SETUP, /* Trying to set up LSAP connection */
|
||||
LSAP_SETUP_PEND, /* Request to start LAP connection */
|
||||
} LSAP_STATE;
|
||||
|
||||
typedef enum {
|
||||
/* LSAP events */
|
||||
LM_CONNECT_REQUEST,
|
||||
LM_CONNECT_CONFIRM,
|
||||
LM_CONNECT_RESPONSE,
|
||||
LM_CONNECT_INDICATION,
|
||||
|
||||
LM_DISCONNECT_INDICATION,
|
||||
LM_DISCONNECT_REQUEST,
|
||||
|
||||
LM_DATA_REQUEST,
|
||||
LM_UDATA_REQUEST,
|
||||
LM_DATA_INDICATION,
|
||||
LM_UDATA_INDICATION,
|
||||
|
||||
LM_WATCHDOG_TIMEOUT,
|
||||
|
||||
/* IrLAP events */
|
||||
LM_LAP_CONNECT_REQUEST,
|
||||
LM_LAP_CONNECT_INDICATION,
|
||||
LM_LAP_CONNECT_CONFIRM,
|
||||
LM_LAP_DISCONNECT_INDICATION,
|
||||
LM_LAP_DISCONNECT_REQUEST,
|
||||
LM_LAP_DISCOVERY_REQUEST,
|
||||
LM_LAP_DISCOVERY_CONFIRM,
|
||||
LM_LAP_IDLE_TIMEOUT,
|
||||
} IRLMP_EVENT;
|
||||
|
||||
extern const char *irlmp_state[];
|
||||
extern const char *irlsap_state[];
|
||||
|
||||
void irlmp_watchdog_timer_expired(void *data);
|
||||
void irlmp_discovery_timer_expired(void *data);
|
||||
void irlmp_idle_timer_expired(void *data);
|
||||
|
||||
void irlmp_do_lap_event(struct lap_cb *self, IRLMP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
int irlmp_do_lsap_event(struct lsap_cb *self, IRLMP_EVENT event,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#endif /* IRLMP_EVENT_H */
|
||||
|
||||
|
||||
|
||||
|
63
include/net/irda/irlmp_frame.h
Normal file
63
include/net/irda/irlmp_frame.h
Normal file
@@ -0,0 +1,63 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irlmp_frame.h
|
||||
* Version: 0.9
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Aug 19 02:09:59 1997
|
||||
* Modified at: Fri Dec 10 13:21:53 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRMLP_FRAME_H
|
||||
#define IRMLP_FRAME_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/irda/discovery.h>
|
||||
|
||||
/* IrLMP frame opcodes */
|
||||
#define CONNECT_CMD 0x01
|
||||
#define CONNECT_CNF 0x81
|
||||
#define DISCONNECT 0x02
|
||||
#define ACCESSMODE_CMD 0x03
|
||||
#define ACCESSMODE_CNF 0x83
|
||||
|
||||
#define CONTROL_BIT 0x80
|
||||
|
||||
void irlmp_send_data_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
|
||||
int expedited, struct sk_buff *skb);
|
||||
void irlmp_send_lcf_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
|
||||
__u8 opcode, struct sk_buff *skb);
|
||||
void irlmp_link_data_indication(struct lap_cb *, struct sk_buff *,
|
||||
int unreliable);
|
||||
#ifdef CONFIG_IRDA_ULTRA
|
||||
void irlmp_link_unitdata_indication(struct lap_cb *, struct sk_buff *);
|
||||
#endif /* CONFIG_IRDA_ULTRA */
|
||||
|
||||
void irlmp_link_connect_indication(struct lap_cb *, __u32 saddr, __u32 daddr,
|
||||
struct qos_info *qos, struct sk_buff *skb);
|
||||
void irlmp_link_connect_request(__u32 daddr);
|
||||
void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos,
|
||||
struct sk_buff *skb);
|
||||
void irlmp_link_disconnect_indication(struct lap_cb *, struct irlap_cb *,
|
||||
LAP_REASON reason, struct sk_buff *);
|
||||
void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log);
|
||||
void irlmp_link_discovery_indication(struct lap_cb *, discovery_t *discovery);
|
||||
|
||||
#endif
|
109
include/net/irda/irmod.h
Normal file
109
include/net/irda/irmod.h
Normal file
@@ -0,0 +1,109 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irmod.h
|
||||
* Version: 0.3
|
||||
* Description: IrDA module and utilities functions
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Dec 15 13:58:52 1997
|
||||
* Modified at: Fri Jan 28 13:15:24 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-2000 Dag Brattli, All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charg.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRMOD_H
|
||||
#define IRMOD_H
|
||||
|
||||
/* Misc status information */
|
||||
typedef enum {
|
||||
STATUS_OK,
|
||||
STATUS_ABORTED,
|
||||
STATUS_NO_ACTIVITY,
|
||||
STATUS_NOISY,
|
||||
STATUS_REMOTE,
|
||||
} LINK_STATUS;
|
||||
|
||||
typedef enum {
|
||||
LOCK_NO_CHANGE,
|
||||
LOCK_LOCKED,
|
||||
LOCK_UNLOCKED,
|
||||
} LOCK_STATUS;
|
||||
|
||||
typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
|
||||
|
||||
/*
|
||||
* IrLMP disconnect reasons. The order is very important, since they
|
||||
* correspond to disconnect reasons sent in IrLMP disconnect frames, so
|
||||
* please do not touch :-)
|
||||
*/
|
||||
typedef enum {
|
||||
LM_USER_REQUEST = 1, /* User request */
|
||||
LM_LAP_DISCONNECT, /* Unexpected IrLAP disconnect */
|
||||
LM_CONNECT_FAILURE, /* Failed to establish IrLAP connection */
|
||||
LM_LAP_RESET, /* IrLAP reset */
|
||||
LM_INIT_DISCONNECT, /* Link Management initiated disconnect */
|
||||
LM_LSAP_NOTCONN, /* Data delivered on unconnected LSAP */
|
||||
LM_NON_RESP_CLIENT, /* Non responsive LM-MUX client */
|
||||
LM_NO_AVAIL_CLIENT, /* No available LM-MUX client */
|
||||
LM_CONN_HALF_OPEN, /* Connection is half open */
|
||||
LM_BAD_SOURCE_ADDR, /* Illegal source address (i.e 0x00) */
|
||||
} LM_REASON;
|
||||
#define LM_UNKNOWN 0xff /* Unspecified disconnect reason */
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct qos_info; /* in <net/irda/qos.h> */
|
||||
|
||||
/*
|
||||
* Notify structure used between transport and link management layers
|
||||
*/
|
||||
typedef struct {
|
||||
int (*data_indication)(void *priv, void *sap, struct sk_buff *skb);
|
||||
int (*udata_indication)(void *priv, void *sap, struct sk_buff *skb);
|
||||
void (*connect_confirm)(void *instance, void *sap,
|
||||
struct qos_info *qos, __u32 max_sdu_size,
|
||||
__u8 max_header_size, struct sk_buff *skb);
|
||||
void (*connect_indication)(void *instance, void *sap,
|
||||
struct qos_info *qos, __u32 max_sdu_size,
|
||||
__u8 max_header_size, struct sk_buff *skb);
|
||||
void (*disconnect_indication)(void *instance, void *sap,
|
||||
LM_REASON reason, struct sk_buff *);
|
||||
void (*flow_indication)(void *instance, void *sap, LOCAL_FLOW flow);
|
||||
void (*status_indication)(void *instance,
|
||||
LINK_STATUS link, LOCK_STATUS lock);
|
||||
void *instance; /* Layer instance pointer */
|
||||
char name[16]; /* Name of layer */
|
||||
} notify_t;
|
||||
|
||||
#define NOTIFY_MAX_NAME 16
|
||||
|
||||
/* Zero the notify structure */
|
||||
void irda_notify_init(notify_t *notify);
|
||||
|
||||
/* Locking wrapper - Note the inverted logic on irda_lock().
|
||||
* Those function basically return false if the lock is already in the
|
||||
* position you want to set it. - Jean II */
|
||||
#define irda_lock(lock) (! test_and_set_bit(0, (void *) (lock)))
|
||||
#define irda_unlock(lock) (test_and_clear_bit(0, (void *) (lock)))
|
||||
|
||||
#endif /* IRMOD_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
96
include/net/irda/irqueue.h
Normal file
96
include/net/irda/irqueue.h
Normal file
@@ -0,0 +1,96 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irqueue.h
|
||||
* Version: 0.3
|
||||
* Description: General queue implementation
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Tue Jun 9 13:26:50 1998
|
||||
* Modified at: Thu Oct 7 13:25:16 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (C) 1998-1999, Aage Kvalnes <aage@cs.uit.no>
|
||||
* Copyright (c) 1998, Dag Brattli
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This code is taken from the Vortex Operating System written by Aage
|
||||
* Kvalnes and has been ported to Linux and Linux/IR by Dag Brattli
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#ifndef IRDA_QUEUE_H
|
||||
#define IRDA_QUEUE_H
|
||||
|
||||
#define NAME_SIZE 32
|
||||
|
||||
/*
|
||||
* Hash types (some flags can be xored)
|
||||
* See comments in irqueue.c for which one to use...
|
||||
*/
|
||||
#define HB_NOLOCK 0 /* No concurent access prevention */
|
||||
#define HB_LOCK 1 /* Prevent concurent write with global lock */
|
||||
|
||||
/*
|
||||
* Hash defines
|
||||
*/
|
||||
#define HASHBIN_SIZE 8
|
||||
#define HASHBIN_MASK 0x7
|
||||
|
||||
#ifndef IRDA_ALIGN
|
||||
#define IRDA_ALIGN __attribute__((aligned))
|
||||
#endif
|
||||
|
||||
#define Q_NULL { NULL, NULL, "", 0 }
|
||||
|
||||
typedef void (*FREE_FUNC)(void *arg);
|
||||
|
||||
struct irda_queue {
|
||||
struct irda_queue *q_next;
|
||||
struct irda_queue *q_prev;
|
||||
|
||||
char q_name[NAME_SIZE];
|
||||
long q_hash; /* Must be able to cast a (void *) */
|
||||
};
|
||||
typedef struct irda_queue irda_queue_t;
|
||||
|
||||
typedef struct hashbin_t {
|
||||
__u32 magic;
|
||||
int hb_type;
|
||||
int hb_size;
|
||||
spinlock_t hb_spinlock; /* HB_LOCK - Can be used by the user */
|
||||
|
||||
irda_queue_t* hb_queue[HASHBIN_SIZE] IRDA_ALIGN;
|
||||
|
||||
irda_queue_t* hb_current;
|
||||
} hashbin_t;
|
||||
|
||||
hashbin_t *hashbin_new(int type);
|
||||
int hashbin_delete(hashbin_t* hashbin, FREE_FUNC func);
|
||||
int hashbin_clear(hashbin_t* hashbin, FREE_FUNC free_func);
|
||||
void hashbin_insert(hashbin_t* hashbin, irda_queue_t* entry, long hashv,
|
||||
const char* name);
|
||||
void* hashbin_remove(hashbin_t* hashbin, long hashv, const char* name);
|
||||
void* hashbin_remove_first(hashbin_t *hashbin);
|
||||
void* hashbin_remove_this( hashbin_t* hashbin, irda_queue_t* entry);
|
||||
void* hashbin_find(hashbin_t* hashbin, long hashv, const char* name);
|
||||
void* hashbin_lock_find(hashbin_t* hashbin, long hashv, const char* name);
|
||||
void* hashbin_find_next(hashbin_t* hashbin, long hashv, const char* name,
|
||||
void ** pnext);
|
||||
irda_queue_t *hashbin_get_first(hashbin_t *hashbin);
|
||||
irda_queue_t *hashbin_get_next(hashbin_t *hashbin);
|
||||
|
||||
#define HASHBIN_GET_SIZE(hashbin) hashbin->hb_size
|
||||
|
||||
#endif
|
210
include/net/irda/irttp.h
Normal file
210
include/net/irda/irttp.h
Normal file
@@ -0,0 +1,210 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: irttp.h
|
||||
* Version: 1.0
|
||||
* Description: Tiny Transport Protocol (TTP) definitions
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sun Aug 31 20:14:31 1997
|
||||
* Modified at: Sun Dec 12 13:09:07 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRTTP_H
|
||||
#define IRTTP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
#include <net/irda/irlmp.h> /* struct lsap_cb */
|
||||
#include <net/irda/qos.h> /* struct qos_info */
|
||||
#include <net/irda/irqueue.h>
|
||||
|
||||
#define TTP_MAX_CONNECTIONS LM_MAX_CONNECTIONS
|
||||
#define TTP_HEADER 1
|
||||
#define TTP_MAX_HEADER (TTP_HEADER + LMP_MAX_HEADER)
|
||||
#define TTP_SAR_HEADER 5
|
||||
#define TTP_PARAMETERS 0x80
|
||||
#define TTP_MORE 0x80
|
||||
|
||||
/* Transmission queue sizes */
|
||||
/* Worst case scenario, two window of data - Jean II */
|
||||
#define TTP_TX_MAX_QUEUE 14
|
||||
/* We need to keep at least 5 frames to make sure that we can refill
|
||||
* appropriately the LAP layer. LAP keeps only two buffers, and we need
|
||||
* to have 7 to make a full window - Jean II */
|
||||
#define TTP_TX_LOW_THRESHOLD 5
|
||||
/* Most clients are synchronous with respect to flow control, so we can
|
||||
* keep a low number of Tx buffers in TTP - Jean II */
|
||||
#define TTP_TX_HIGH_THRESHOLD 7
|
||||
|
||||
/* Receive queue sizes */
|
||||
/* Minimum of credit that the peer should hold.
|
||||
* If the peer has less credits than 9 frames, we will explicitely send
|
||||
* him some credits (through irttp_give_credit() and a specific frame).
|
||||
* Note that when we give credits it's likely that it won't be sent in
|
||||
* this LAP window, but in the next one. So, we make sure that the peer
|
||||
* has something to send while waiting for credits (one LAP window == 7
|
||||
* + 1 frames while he process the credits). - Jean II */
|
||||
#define TTP_RX_MIN_CREDIT 8
|
||||
/* This is the default maximum number of credits held by the peer, so the
|
||||
* default maximum number of frames he can send us before needing flow
|
||||
* control answer from us (this may be negociated differently at TSAP setup).
|
||||
* We want to minimise the number of times we have to explicitely send some
|
||||
* credit to the peer, hoping we can piggyback it on the return data. In
|
||||
* particular, it doesn't make sense for us to send credit more than once
|
||||
* per LAP window.
|
||||
* Moreover, giving credits has some latency, so we need strictly more than
|
||||
* a LAP window, otherwise we may already have credits in our Tx queue.
|
||||
* But on the other hand, we don't want to keep too many Rx buffer here
|
||||
* before starting to flow control the other end, so make it exactly one
|
||||
* LAP window + 1 + MIN_CREDITS. - Jean II */
|
||||
#define TTP_RX_DEFAULT_CREDIT 16
|
||||
/* Maximum number of credits we can allow the peer to have, and therefore
|
||||
* maximum Rx queue size.
|
||||
* Note that we try to deliver packets to the higher layer every time we
|
||||
* receive something, so in normal mode the Rx queue will never contains
|
||||
* more than one or two packets. - Jean II */
|
||||
#define TTP_RX_MAX_CREDIT 21
|
||||
|
||||
/* What clients should use when calling ttp_open_tsap() */
|
||||
#define DEFAULT_INITIAL_CREDIT TTP_RX_DEFAULT_CREDIT
|
||||
|
||||
/* Some priorities for disconnect requests */
|
||||
#define P_NORMAL 0
|
||||
#define P_HIGH 1
|
||||
|
||||
#define TTP_SAR_DISABLE 0
|
||||
#define TTP_SAR_UNBOUND 0xffffffff
|
||||
|
||||
/* Parameters */
|
||||
#define TTP_MAX_SDU_SIZE 0x01
|
||||
|
||||
/*
|
||||
* This structure contains all data assosiated with one instance of a TTP
|
||||
* connection.
|
||||
*/
|
||||
struct tsap_cb {
|
||||
irda_queue_t q; /* Must be first */
|
||||
magic_t magic; /* Just in case */
|
||||
|
||||
__u8 stsap_sel; /* Source TSAP */
|
||||
__u8 dtsap_sel; /* Destination TSAP */
|
||||
|
||||
struct lsap_cb *lsap; /* Corresponding LSAP to this TSAP */
|
||||
|
||||
__u8 connected; /* TSAP connected */
|
||||
|
||||
__u8 initial_credit; /* Initial credit to give peer */
|
||||
|
||||
int avail_credit; /* Available credit to return to peer */
|
||||
int remote_credit; /* Credit held by peer TTP entity */
|
||||
int send_credit; /* Credit held by local TTP entity */
|
||||
|
||||
struct sk_buff_head tx_queue; /* Frames to be transmitted */
|
||||
struct sk_buff_head rx_queue; /* Received frames */
|
||||
struct sk_buff_head rx_fragments;
|
||||
int tx_queue_lock;
|
||||
int rx_queue_lock;
|
||||
spinlock_t lock;
|
||||
|
||||
notify_t notify; /* Callbacks to client layer */
|
||||
|
||||
struct net_device_stats stats;
|
||||
struct timer_list todo_timer;
|
||||
|
||||
__u32 max_seg_size; /* Max data that fit into an IrLAP frame */
|
||||
__u8 max_header_size;
|
||||
|
||||
int rx_sdu_busy; /* RxSdu.busy */
|
||||
__u32 rx_sdu_size; /* Current size of a partially received frame */
|
||||
__u32 rx_max_sdu_size; /* Max receive user data size */
|
||||
|
||||
int tx_sdu_busy; /* TxSdu.busy */
|
||||
__u32 tx_max_sdu_size; /* Max transmit user data size */
|
||||
|
||||
int close_pend; /* Close, but disconnect_pend */
|
||||
unsigned long disconnect_pend; /* Disconnect, but still data to send */
|
||||
struct sk_buff *disconnect_skb;
|
||||
};
|
||||
|
||||
struct irttp_cb {
|
||||
magic_t magic;
|
||||
hashbin_t *tsaps;
|
||||
};
|
||||
|
||||
int irttp_init(void);
|
||||
void irttp_cleanup(void);
|
||||
|
||||
struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit, notify_t *notify);
|
||||
int irttp_close_tsap(struct tsap_cb *self);
|
||||
|
||||
int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb);
|
||||
int irttp_udata_request(struct tsap_cb *self, struct sk_buff *skb);
|
||||
|
||||
int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
|
||||
__u32 saddr, __u32 daddr,
|
||||
struct qos_info *qos, __u32 max_sdu_size,
|
||||
struct sk_buff *userdata);
|
||||
int irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size,
|
||||
struct sk_buff *userdata);
|
||||
int irttp_disconnect_request(struct tsap_cb *self, struct sk_buff *skb,
|
||||
int priority);
|
||||
void irttp_flow_request(struct tsap_cb *self, LOCAL_FLOW flow);
|
||||
struct tsap_cb *irttp_dup(struct tsap_cb *self, void *instance);
|
||||
|
||||
static __inline __u32 irttp_get_saddr(struct tsap_cb *self)
|
||||
{
|
||||
return irlmp_get_saddr(self->lsap);
|
||||
}
|
||||
|
||||
static __inline __u32 irttp_get_daddr(struct tsap_cb *self)
|
||||
{
|
||||
return irlmp_get_daddr(self->lsap);
|
||||
}
|
||||
|
||||
static __inline __u32 irttp_get_max_seg_size(struct tsap_cb *self)
|
||||
{
|
||||
return self->max_seg_size;
|
||||
}
|
||||
|
||||
/* After doing a irttp_dup(), this get one of the two socket back into
|
||||
* a state where it's waiting incomming connections.
|
||||
* Note : this can be used *only* if the socket is not yet connected
|
||||
* (i.e. NO irttp_connect_response() done on this socket).
|
||||
* - Jean II */
|
||||
static inline void irttp_listen(struct tsap_cb *self)
|
||||
{
|
||||
irlmp_listen(self->lsap);
|
||||
self->dtsap_sel = LSAP_ANY;
|
||||
}
|
||||
|
||||
/* Return TRUE if the node is in primary mode (i.e. master)
|
||||
* - Jean II */
|
||||
static inline int irttp_is_primary(struct tsap_cb *self)
|
||||
{
|
||||
if ((self == NULL) ||
|
||||
(self->lsap == NULL) ||
|
||||
(self->lsap->lap == NULL) ||
|
||||
(self->lsap->lap->irlap == NULL))
|
||||
return -2;
|
||||
return(irlap_is_primary(self->lsap->lap->irlap));
|
||||
}
|
||||
|
||||
#endif /* IRTTP_H */
|
102
include/net/irda/parameters.h
Normal file
102
include/net/irda/parameters.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: parameters.h
|
||||
* Version: 1.0
|
||||
* Description: A more general way to handle (pi,pl,pv) parameters
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Jun 7 08:47:28 1999
|
||||
* Modified at: Sun Jan 30 14:05:14 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
* Michel D<>nzer <daenzer@debian.org>, 10/2001
|
||||
* - simplify irda_pv_t to avoid endianness issues
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRDA_PARAMS_H
|
||||
#define IRDA_PARAMS_H
|
||||
|
||||
/*
|
||||
* The currently supported types. Beware not to change the sequence since
|
||||
* it a good reason why the sized integers has a value equal to their size
|
||||
*/
|
||||
typedef enum {
|
||||
PV_INTEGER, /* Integer of any (pl) length */
|
||||
PV_INT_8_BITS, /* Integer of 8 bits in length */
|
||||
PV_INT_16_BITS, /* Integer of 16 bits in length */
|
||||
PV_STRING, /* \0 terminated string */
|
||||
PV_INT_32_BITS, /* Integer of 32 bits in length */
|
||||
PV_OCT_SEQ, /* Octet sequence */
|
||||
PV_NO_VALUE /* Does not contain any value (pl=0) */
|
||||
} PV_TYPE;
|
||||
|
||||
/* Bit 7 of type field */
|
||||
#define PV_BIG_ENDIAN 0x80
|
||||
#define PV_LITTLE_ENDIAN 0x00
|
||||
#define PV_MASK 0x7f /* To mask away endian bit */
|
||||
|
||||
#define PV_PUT 0
|
||||
#define PV_GET 1
|
||||
|
||||
typedef union {
|
||||
char *c;
|
||||
__u32 i;
|
||||
__u32 *ip;
|
||||
} irda_pv_t;
|
||||
|
||||
typedef struct {
|
||||
__u8 pi;
|
||||
__u8 pl;
|
||||
irda_pv_t pv;
|
||||
} irda_param_t;
|
||||
|
||||
typedef int (*PI_HANDLER)(void *self, irda_param_t *param, int get);
|
||||
typedef int (*PV_HANDLER)(void *self, __u8 *buf, int len, __u8 pi,
|
||||
PV_TYPE type, PI_HANDLER func);
|
||||
|
||||
typedef struct {
|
||||
PI_HANDLER func; /* Handler for this parameter identifier */
|
||||
PV_TYPE type; /* Data type for this parameter */
|
||||
} pi_minor_info_t;
|
||||
|
||||
typedef struct {
|
||||
pi_minor_info_t *pi_minor_call_table;
|
||||
int len;
|
||||
} pi_major_info_t;
|
||||
|
||||
typedef struct {
|
||||
pi_major_info_t *tables;
|
||||
int len;
|
||||
__u8 pi_mask;
|
||||
int pi_major_offset;
|
||||
} pi_param_info_t;
|
||||
|
||||
int irda_param_pack(__u8 *buf, char *fmt, ...);
|
||||
|
||||
int irda_param_insert(void *self, __u8 pi, __u8 *buf, int len,
|
||||
pi_param_info_t *info);
|
||||
int irda_param_extract_all(void *self, __u8 *buf, int len,
|
||||
pi_param_info_t *info);
|
||||
|
||||
#define irda_param_insert_byte(buf,pi,pv) irda_param_pack(buf,"bbb",pi,1,pv)
|
||||
|
||||
#endif /* IRDA_PARAMS_H */
|
||||
|
104
include/net/irda/qos.h
Normal file
104
include/net/irda/qos.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: qos.h
|
||||
* Version: 1.0
|
||||
* Description: Quality of Service definitions
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Fri Sep 19 23:21:09 1997
|
||||
* Modified at: Thu Dec 2 13:51:54 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1999 Dag Brattli, All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef IRDA_QOS_H
|
||||
#define IRDA_QOS_H
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <net/irda/parameters.h>
|
||||
|
||||
#define PI_BAUD_RATE 0x01
|
||||
#define PI_MAX_TURN_TIME 0x82
|
||||
#define PI_DATA_SIZE 0x83
|
||||
#define PI_WINDOW_SIZE 0x84
|
||||
#define PI_ADD_BOFS 0x85
|
||||
#define PI_MIN_TURN_TIME 0x86
|
||||
#define PI_LINK_DISC 0x08
|
||||
|
||||
#define IR_115200_MAX 0x3f
|
||||
|
||||
/* Baud rates (first byte) */
|
||||
#define IR_2400 0x01
|
||||
#define IR_9600 0x02
|
||||
#define IR_19200 0x04
|
||||
#define IR_38400 0x08
|
||||
#define IR_57600 0x10
|
||||
#define IR_115200 0x20
|
||||
#define IR_576000 0x40
|
||||
#define IR_1152000 0x80
|
||||
|
||||
/* Baud rates (second byte) */
|
||||
#define IR_4000000 0x01
|
||||
#define IR_16000000 0x02
|
||||
|
||||
/* Quality of Service information */
|
||||
typedef struct {
|
||||
__u32 value;
|
||||
__u16 bits; /* LSB is first byte, MSB is second byte */
|
||||
} qos_value_t;
|
||||
|
||||
struct qos_info {
|
||||
magic_t magic;
|
||||
|
||||
qos_value_t baud_rate; /* IR_11520O | ... */
|
||||
qos_value_t max_turn_time;
|
||||
qos_value_t data_size;
|
||||
qos_value_t window_size;
|
||||
qos_value_t additional_bofs;
|
||||
qos_value_t min_turn_time;
|
||||
qos_value_t link_disc_time;
|
||||
|
||||
qos_value_t power;
|
||||
};
|
||||
|
||||
extern int sysctl_max_baud_rate;
|
||||
extern int sysctl_max_inactive_time;
|
||||
|
||||
void irda_init_max_qos_capabilies(struct qos_info *qos);
|
||||
void irda_qos_compute_intersection(struct qos_info *, struct qos_info *);
|
||||
|
||||
__u32 irlap_max_line_capacity(__u32 speed, __u32 max_turn_time);
|
||||
|
||||
void irda_qos_bits_to_value(struct qos_info *qos);
|
||||
|
||||
/* So simple, how could we not inline those two ?
|
||||
* Note : one byte is 10 bits if you include start and stop bits
|
||||
* Jean II */
|
||||
#define irlap_min_turn_time_in_bytes(speed, min_turn_time) ( \
|
||||
speed * min_turn_time / 10000000 \
|
||||
)
|
||||
#define irlap_xbofs_in_usec(speed, xbofs) ( \
|
||||
xbofs * 10000000 / speed \
|
||||
)
|
||||
|
||||
#endif
|
||||
|
104
include/net/irda/timer.h
Normal file
104
include/net/irda/timer.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: timer.h
|
||||
* Version:
|
||||
* Description:
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Sat Aug 16 00:59:29 1997
|
||||
* Modified at: Thu Oct 7 12:25:24 1999
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1997, 1998-1999 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
* Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef TIMER_H
|
||||
#define TIMER_H
|
||||
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <asm/param.h> /* for HZ */
|
||||
|
||||
#include <net/irda/irda.h>
|
||||
|
||||
/* A few forward declarations (to make compiler happy) */
|
||||
struct irlmp_cb;
|
||||
struct irlap_cb;
|
||||
struct lsap_cb;
|
||||
struct lap_cb;
|
||||
|
||||
/*
|
||||
* Timeout definitions, some defined in IrLAP 6.13.5 - p. 92
|
||||
*/
|
||||
#define POLL_TIMEOUT (450*HZ/1000) /* Must never exceed 500 ms */
|
||||
#define FINAL_TIMEOUT (500*HZ/1000) /* Must never exceed 500 ms */
|
||||
|
||||
/*
|
||||
* Normally twice of p-timer. Note 3, IrLAP 6.3.11.2 - p. 60 suggests
|
||||
* at least twice duration of the P-timer.
|
||||
*/
|
||||
#define WD_TIMEOUT (POLL_TIMEOUT*2)
|
||||
|
||||
#define MEDIABUSY_TIMEOUT (500*HZ/1000) /* 500 msec */
|
||||
#define SMALLBUSY_TIMEOUT (100*HZ/1000) /* 100 msec - IrLAP 6.13.4 */
|
||||
|
||||
/*
|
||||
* Slot timer must never exceed 85 ms, and must always be at least 25 ms,
|
||||
* suggested to 75-85 msec by IrDA lite. This doesn't work with a lot of
|
||||
* devices, and other stackes uses a lot more, so it's best we do it as well
|
||||
* (Note : this is the default value and sysctl overides it - Jean II)
|
||||
*/
|
||||
#define SLOT_TIMEOUT (90*HZ/1000)
|
||||
|
||||
/*
|
||||
* The latest discovery frame (XID) is longer due to the extra discovery
|
||||
* information (hints, device name...). This is its extra length.
|
||||
* We use that when setting the query timeout. Jean II
|
||||
*/
|
||||
#define XIDEXTRA_TIMEOUT (34*HZ/1000) /* 34 msec */
|
||||
|
||||
#define WATCHDOG_TIMEOUT (20*HZ) /* 20 sec */
|
||||
|
||||
typedef void (*TIMER_CALLBACK)(void *);
|
||||
|
||||
static inline void irda_start_timer(struct timer_list *ptimer, int timeout,
|
||||
void* data, TIMER_CALLBACK callback)
|
||||
{
|
||||
ptimer->function = (void (*)(unsigned long)) callback;
|
||||
ptimer->data = (unsigned long) data;
|
||||
|
||||
/* Set new value for timer (update or add timer).
|
||||
* We use mod_timer() because it's more efficient and also
|
||||
* safer with respect to race conditions - Jean II */
|
||||
mod_timer(ptimer, jiffies + timeout);
|
||||
}
|
||||
|
||||
|
||||
void irlap_start_slot_timer(struct irlap_cb *self, int timeout);
|
||||
void irlap_start_query_timer(struct irlap_cb *self, int S, int s);
|
||||
void irlap_start_final_timer(struct irlap_cb *self, int timeout);
|
||||
void irlap_start_wd_timer(struct irlap_cb *self, int timeout);
|
||||
void irlap_start_backoff_timer(struct irlap_cb *self, int timeout);
|
||||
|
||||
void irlap_start_mbusy_timer(struct irlap_cb *self, int timeout);
|
||||
void irlap_stop_mbusy_timer(struct irlap_cb *);
|
||||
|
||||
void irlmp_start_watchdog_timer(struct lsap_cb *, int timeout);
|
||||
void irlmp_start_discovery_timer(struct irlmp_cb *, int timeout);
|
||||
void irlmp_start_idle_timer(struct lap_cb *, int timeout);
|
||||
void irlmp_stop_idle_timer(struct lap_cb *self);
|
||||
|
||||
#endif
|
||||
|
58
include/net/irda/wrapper.h
Normal file
58
include/net/irda/wrapper.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*********************************************************************
|
||||
*
|
||||
* Filename: wrapper.h
|
||||
* Version: 1.2
|
||||
* Description: IrDA SIR async wrapper layer
|
||||
* Status: Experimental.
|
||||
* Author: Dag Brattli <dagb@cs.uit.no>
|
||||
* Created at: Mon Aug 4 20:40:53 1997
|
||||
* Modified at: Tue Jan 11 12:37:29 2000
|
||||
* Modified by: Dag Brattli <dagb@cs.uit.no>
|
||||
*
|
||||
* Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>,
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Neither Dag Brattli nor University of Troms<6D> admit liability nor
|
||||
* provide warranty for any of this software. This material is
|
||||
* provided "AS-IS" and at no charge.
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
#ifndef WRAPPER_H
|
||||
#define WRAPPER_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <net/irda/irda_device.h> /* iobuff_t */
|
||||
|
||||
#define BOF 0xc0 /* Beginning of frame */
|
||||
#define XBOF 0xff
|
||||
#define EOF 0xc1 /* End of frame */
|
||||
#define CE 0x7d /* Control escape */
|
||||
|
||||
#define STA BOF /* Start flag */
|
||||
#define STO EOF /* End flag */
|
||||
|
||||
#define IRDA_TRANS 0x20 /* Asynchronous transparency modifier */
|
||||
|
||||
/* States for receving a frame in async mode */
|
||||
enum {
|
||||
OUTSIDE_FRAME,
|
||||
BEGIN_FRAME,
|
||||
LINK_ESCAPE,
|
||||
INSIDE_FRAME
|
||||
};
|
||||
|
||||
/* Proto definitions */
|
||||
int async_wrap_skb(struct sk_buff *skb, __u8 *tx_buff, int buffsize);
|
||||
void async_unwrap_char(struct net_device *dev, struct net_device_stats *stats,
|
||||
iobuff_t *buf, __u8 byte);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user